1 、tofixed方法
toFixed() 方法可把 Number 四舍五入為指定小數位數的數字。例如將數據Num保留2位小數,則表示為:toFixed(Num);但是其四舍五入的規則與數學中的規則不同,使用的是銀行家舍入規則,銀行家舍入:所謂銀行家舍入法,其實質是一種四舍六入五取偶(又稱四舍六入五留雙)法。具體規則如下:
簡單來說就是:四舍六入五考慮,五后非零就進一,五后為零看奇偶,五前為偶應舍去,五前為奇要進一。
顯然這種規則不符合我們平常在數據中處理的方式。為了解決這樣的問題,可以自定義去使用Math.round方法進行自定義式 的實現指定保留多少位數據進行處理。
定義和用法
toFixed() 方法可把 Number 四舍五入為指定小數位數的數字。
語法
NumberObject.toFixed(num)
參數 | 描述 |
---|---|
num | 必需。規定小數的位數,是 0 ~ 20 之間的值,包括 0 和 20,有些實現可以支持更大的數值范圍。如果省略了該參數,將用 0 代替。 |
返回值
返回 NumberObject 的字符串表示,不采用指數計數法,小數點后有固定的 num 位數字。如果必要,該數字會被舍入,也可以用 0 補足,以便它達到指定的長度。如果 num 大於 le+21,則該方法只調用 NumberObject.toString(),返回采用指數計數法表示的字符串。
拋出
當 num 太小或太大時拋出異常 RangeError。0 ~ 20 之間的值不會引發該異常。有些實現支持更大范圍或更小范圍內的值。
當調用該方法的對象不是 Number 時拋出 TypeError 異常。
實例
在本例中,我們將把數字舍入為僅有一位小數的數字:
Show the number 13.37 with one decimal:
<script type="text/javascript"> var num = new Number(13.37); document.write (num.toFixed(1)) </script>
輸出:
13.4
2 、round方法
round() 方法可把一個數字舍入為最接近的整數。例如:Math.round(x),則是將x取其最接近的整數。其取舍的方法使用的是四舍五入中的方法,符合數學中取舍的規則。對於小數的處理沒有那么便捷,但是可以根據不同的要求,進行自定義的處理。
例如:對於X進行保留兩位小數的處理,則可以使用Math.round(X * 100) / 100.進行處理。
定義和用法
round() 方法可把一個數字舍入為最接近的整數。
語法
Math.round(x)
參數 描述
x 必需。必須是數字。
返回值
與 x 最接近的整數。
說明
對於 0.5,該方法將進行上舍入。
例如,3.5 將舍入為 4,而 -3.5 將舍入為 -3。
3、JS無法進行精確計算的bug
在做CRM,二代審核需求審核詳情頁面時。需要按比例(后端傳類似0.8的小數)把用戶輸入的數字顯示在不同的地方。
在做dubheInvest = invest * (1 - ratio);運算時發現問題。具體如下:
示例代碼:
console.log( 1 - 0.8 ); //輸出 0.19999999999999996
console.log( 6 * 0.7 ); //輸出 4.199999999999999
console.log( 0.1 + 0.2 ); //輸出 0.30000000000000004
console.log( 0.1 + 0.7 ); //輸出 0.7999999999999999
console.log( 1.2 / 0.2 ); //輸出 5.999999999999999
通過上面舉出的例子可以看到,原生的js運算結果不一定准確,會丟失精度。
解決方案:將浮點數乘以(擴大)10的n次方倍,把浮點數變為整數后再進行相應的運算,最后將得到的結果除以(縮小)10的n次方倍。
如 將 console.log(1-0.8); 變為 console.log((1 * 10 - 0.8 * 10) / 10); 即可得到正確的值
參見JAVA中為什么0.55*100不等於55.0的思考 https://blog.csdn.net/yaerfeng/article/details/7187754