js數值四捨五入的方法以及其中潛在bug的解決方案
阿新 • • 發佈:2019-02-04
1.toFixed() 方法可把 Number 四捨五入為指定小數位數的數字。
NumberObject.toFixed(num)num必需寫,規定小數的位數,是 0 ~ 20 之間的值,包括 0 和 20,有些實現可以支援更大的數值範圍。如果省略了該引數,將用 0 代替。
當num超過20的時候,js會出錯,這東西好像只能傳一個數字進去,字串會爆不是一個方法
方法存在的bug:
Number(13.35).toFixed(1); //13.3
Number(0.055).toFixed(1); //0.1
原因:原生toFixed(x)擷取小數的時候會有誤差
//如果要修改這個缺陷,可以把js中的number型別的tofixed方法重寫。
2.Math.round() 方法可把一個數字舍入為最接近的整數。
Math.round(x)x為需要計算的數值。該方法返回與給出的數值表示式最接近的整數。
方法個存在的bug
Math.round(num * Math.pow(10, 2)) / Math.pow(10, 2); //num是待處理數字Math.pow(10, 2)=100
當num = 10.10500時,計算上述表示式可得10.11。(正常)
當num = "10.50000"時(注意這裡是字串),計算上述表示式可得10.5。(damn it,小數點後位數不對!)
原因:當num是字串,進行乘法操作時,進行了型別轉換,字尾零被丟棄了,導致位數不足,這個時候我們就應該進行補0
解決方案:
var iTofixed =function(num,fractionDigits) {
return (Math.round(num*Math.pow(10,fractionDigits))/Math.pow(10,fractionDigits)+Math.pow(10,-(fractionDigits+1))).toString().slice(0, -1)
};
iTofixed('13.5000',3);
//"13.500"