javascript
《JavaScript入门经典(第4版)》上第5章一个实例程序的修正,完善
?
今日,做《JavaScript入門經(jīng)典(第4版)》第5章上的一個(gè)例題,感覺(jué)書上的代碼有個(gè)小錯(cuò)誤。
這是ch5_examp5.html上的一個(gè)實(shí)例,是計(jì)算一個(gè)數(shù)x保留y小數(shù)位后,四舍五入的結(jié)果是什么。
代碼如下:
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>?
但這個(gè)代碼運(yùn)行后有個(gè)問(wèn)題,就是如果輸入1.995,要求保留2個(gè)小數(shù)位,但結(jié)果卻是“2”,原因在于在用pow()方法乘以原數(shù)字并用Math.round()方法后,這樣的情況會(huì)出現(xiàn)尾數(shù)為“0”的情況,再除以10,100這樣的,就不能保留我們希望保留的小數(shù)位了。
因此,書上的代碼是有問(wèn)題,我捉摸了一下,可以對(duì)原有代碼做個(gè)修正,加一個(gè)if判斷,如果尾數(shù)為0,則說(shuō)明這種情況出現(xiàn)了,需要進(jìn)行修正。新的代碼如下:
?
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)); // 創(chuàng)建一個(gè)新變量z,將Math.round(a)轉(zhuǎn)為字符串類型,這樣就可以用charAt方法判斷字符串的最后一位是否為0) 6: if (z.charAt(z.length-1) ==0) //如果變量z的最后一位為0,則說(shuō)明除以10*y后,會(huì)變成整數(shù),不保留小數(shù)位,所以要用toFixed方法強(qiáng)制保留小數(shù)位; 7: { 8: var u = new Number(x); //創(chuàng)建一個(gè)新變量u,將x轉(zhuǎn)為Number類型,這樣就可以調(diào)用toFixed方法 9: var t = u.toFixed(y); //創(chuàng)建一個(gè)新變量t,將u取小數(shù)位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>?
這個(gè)解決方案比較復(fù)雜,需要先創(chuàng)建一個(gè)新變量z,將原數(shù)據(jù)變量類型轉(zhuǎn)為字符串,才好使用charAt方法去獲取最后一個(gè)字符值(我試了,charAt方法,只能用于字符串類型),然后進(jìn)行條件判斷,如果變量z最后一位是0,則需要將變量x先轉(zhuǎn)為Number類型,再使用toFixed方法,強(qiáng)制賦予y位的小數(shù)位。
但這個(gè)解決方案,也不是很好,簡(jiǎn)單的問(wèn)題,搞得這么復(fù)雜,中間涉及大量數(shù)據(jù)轉(zhuǎn)換乃至數(shù)據(jù)類型轉(zhuǎn)換,如果不是為了學(xué)知識(shí),僅是從算法而言,是在不符合“簡(jiǎn)單為美”的原則。后來(lái)想到既然將簡(jiǎn)單數(shù)值型變量,用new Number方法轉(zhuǎn)為Number對(duì)象后,就可以使用toFixed()方法了,為何還要使用pow()方法+round()方法的方式去處理?可以直接轉(zhuǎn)換成Number對(duì)象再?gòu)?qiáng)制保留小數(shù)位即可。代碼優(yōu)化后如下,執(zhí)行結(jié)果完全無(wú)問(wèn)題。
?
1: <script type = "text/javascript"> 2: function deci(x,y){ 3: var a = new Number(x); //將變量x轉(zhuǎn)換為Number對(duì)象類型,這樣就可以使用toFixed()方法了 4: var b = a.toFixed(y); //toFixed()方法,可以實(shí)現(xiàn)按規(guī)定小數(shù)位四舍五入 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>轉(zhuǎn)載于:https://www.cnblogs.com/cddf/archive/2011/11/23/2259733.html
總結(jié)
以上是生活随笔為你收集整理的《JavaScript入门经典(第4版)》上第5章一个实例程序的修正,完善的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jQuery 时间控件推荐(1)
- 下一篇: 网络摄像头1 mjpg-streamer