前言:
在 Javascript 中,toFixed() 方法可以将一个数字保留指定位数的小数。但是这个方法存在一个问题,对于某些数字在小数部分保留时可能会出现精度错误。本文将介绍如何修正toFixed()方法在某些情况下出现的精度错误。
修正toFixed()方法的代码:
我们将修正后的代码命名为toFixedNew()方法。toFixedNew()方法可以解决toFixed()在某些情况下的精度问题。下面是代码实现:
Number.prototype.toFixedNew = function(n){
const b = this.toLocaleString()
const c = b.split('.')[1] || ''
if (n == null || n == 0) {
return parseInt(b);
}
return parseInt(this * Math.pow(10,n)) / Math.pow(10,n) + ( c.length > n ? `.${c.slice(0,n)}` : c ? `.${c}` : Array(n+1).join('0') )
}
代码实现的思路:
- 首先,将数值转化为本地形式,包括小数点,千分位分隔符等;
- 然后,将小数点后的数字字符进行处理得到小数部分;
- 若保留小数位数为 null 或者为 0,则返回整数;
- 否则,返回修正后的结果:将原数乘以10的n次方,取整后再除以10的n次方,最后将小数部分根据保留小数位数进行处理,同时考虑小数位数不够的情况。
示例说明:
下面分两个示例说明toFixedNew()方法的使用:
例1:将 0.1 和 0.2 相加后保留一位小数的结果
const a = 0.1, b = 0.2;
let c = (a + b).toFixedNew(1);
console.log(c); //0.3
上述代码输出结果正确。
例2:保留 2 位小数
const a = 0.615, b = 10.235, c = 0.125;
console.log(a.toFixedNew(2)); //0.62
console.log(b.toFixedNew(2)); //10.24
console.log(c.toFixedNew(2)); //0.13
上述代码输出结果可以看出,修正后的方法得出的保留指定位数的小数正确无误。
结束语:
通过自定义一个toFixedNew()方法可以避免toFixed()方法在某些情况下存在的精度问题。以上代码仅为一种修正方案,读者可以结合实际情况进行修改和使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript之对系统的toFixed()方法的修正 - Python技术站