javascript
《JavaScript入门经典(第4版)》上第5章一个实例程序的修正,完善
?
今日,做《JavaScript入門經典(第4版)》第5章上的一個例題,感覺書上的代碼有個小錯誤。
這是ch5_examp5.html上的一個實例,是計算一個數x保留y小數位后,四舍五入的結果是什么。
代碼如下:
1: <script type="text/javascript"> 2: ? 3: function fix(fixNumber, decimalPlaces) 4: { 5: var div = Math.pow(10,decimalPlaces); 6: fixNumber = Math.round(fixNumber * div) / div; 7: return fixNumber; 8: } 9: </script> 10: </head> 11: <body> 12: <script type="text/javascript"> 13: ? 14: var number1 = prompt("Enter the number with decimal places you want to fix",""); 15: var number2 = prompt("How many decimal places do you want?",""); 16: ? 17: document.write(number1 + " fixed to " + number2 + " decimal places is: "); 18: document.write(fix(number1,number2)); 19: ? 20: </script>?
但這個代碼運行后有個問題,就是如果輸入1.995,要求保留2個小數位,但結果卻是“2”,原因在于在用pow()方法乘以原數字并用Math.round()方法后,這樣的情況會出現尾數為“0”的情況,再除以10,100這樣的,就不能保留我們希望保留的小數位了。
因此,書上的代碼是有問題,我捉摸了一下,可以對原有代碼做個修正,加一個if判斷,如果尾數為0,則說明這種情況出現了,需要進行修正。新的代碼如下:
?
1: <script type = "text/javascript"> 2: function deci(x,y){ 3: var a = x*(Math.pow(10,y)); 4: x = (Math.round(a)) / (Math.pow(10,y)); 5: var z = new String(Math.round(a)); // 創建一個新變量z,將Math.round(a)轉為字符串類型,這樣就可以用charAt方法判斷字符串的最后一位是否為0) 6: if (z.charAt(z.length-1) ==0) //如果變量z的最后一位為0,則說明除以10*y后,會變成整數,不保留小數位,所以要用toFixed方法強制保留小數位; 7: { 8: var u = new Number(x); //創建一個新變量u,將x轉為Number類型,這樣就可以調用toFixed方法 9: var t = u.toFixed(y); //創建一個新變量t,將u取小數位y位; 10: return t; 11: } 12: else 13: return x; 14: } 15: var X1 = prompt("please input x", ""); 16: var Y1 = prompt("please input y",""); 17: 18: document.write(deci(X1,Y1)); 19: </script>?
這個解決方案比較復雜,需要先創建一個新變量z,將原數據變量類型轉為字符串,才好使用charAt方法去獲取最后一個字符值(我試了,charAt方法,只能用于字符串類型),然后進行條件判斷,如果變量z最后一位是0,則需要將變量x先轉為Number類型,再使用toFixed方法,強制賦予y位的小數位。
但這個解決方案,也不是很好,簡單的問題,搞得這么復雜,中間涉及大量數據轉換乃至數據類型轉換,如果不是為了學知識,僅是從算法而言,是在不符合“簡單為美”的原則。后來想到既然將簡單數值型變量,用new Number方法轉為Number對象后,就可以使用toFixed()方法了,為何還要使用pow()方法+round()方法的方式去處理?可以直接轉換成Number對象再強制保留小數位即可。代碼優化后如下,執行結果完全無問題。
?
1: <script type = "text/javascript"> 2: function deci(x,y){ 3: var a = new Number(x); //將變量x轉換為Number對象類型,這樣就可以使用toFixed()方法了 4: var b = a.toFixed(y); //toFixed()方法,可以實現按規定小數位四舍五入 5: return b; 6: } 7: var X1 = prompt("please input x", ""); 8: var Y1 = prompt("please input y",""); 9: 10: document.write(deci(X1,Y1)); 11: </script>轉載于:https://www.cnblogs.com/cddf/archive/2011/11/23/2259733.html
總結
以上是生活随笔為你收集整理的《JavaScript入门经典(第4版)》上第5章一个实例程序的修正,完善的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery 时间控件推荐(1)
- 下一篇: 《JavaScript高级程序设计》阅读