在日常使用toFixed的时候总会遇到一些奇奇怪怪的问题,经常会出现保留小数位数出现错误的时候,从网上搜索了一下,主流的说法是他们的算法是银行家舍入法,有兴趣大家可以自行百度。
比如:
3.55.toFixed(1) // 结果为3.5
大概意思就是 3.55在toFixed看来它是3.5499999循环9,所以在保留一位小数的时候是3.5而不是3.6
有两种方法解决问题:
第一种就是使用插件:number-precision
npm install number-precision --save
import NP from 'number-precision'
NP.round(3.55, 1); // 3.6
其中number-precision还有许多解决关于js的精度问题
console.log(0.1 + 0.2) // 0.30000000000000004
NP.plus(0.1, 0.2) // 0.3
// 其他用法 大家可以自行使用
NP.plus(num1, num2, num3, ...) // num + num2 + num3
NP.minus(num1, num2, num3, ...) // num1 - num2 - num3
NP.times(num1, num2, num3, ...) // num1 * num2 * num3
NP.divide(num1, num2, num3, ...) // num1 / num2 / num3
第二种方法:自己封装
以下是从掘金上看大佬的写法:js精度丢失的问题,重新封装toFixed() - 掘金 (juejin.cn)
javascript
export function toFixed(num, fixed = 2) {//fixed是小数保留的位数
let numSplit = num.toString().split('.');
if (numSplit.length == 1 || !numSplit[1][fixed] || numSplit[1][fixed] <= 4) {
return num.toFixed(fixed);
}
numSplit[1] = +numSplit[1].substring(0, fixed) + 1 + '';
if (numSplit[1].length > fixed) {
numSplit[0] = +numSplit[0] + 1;
numSplit[1] = numSplit[1].substring(1, fixed + 1);
}
return numSplit.join('.');
}