我们在使用 javascript 对Number类型的数据进行加减乘除运算时经常会出现精度丢失问题,比如这样:
如果我们把计算后的结果保存在一个变量里面,再使用这个变量进行其他操作,可能就会给程序带来一些隐患的bug,那么怎么解决这个问题呢?
比较常见的解决方法是:
1. (0.1 * 10 + 0.2 * 10)/ 10 先把小数变整数,然后进行加减法后再变成小数
2. let a = 0.1 + 0.2 a.toFixed(1) 使用toFixed进行四舍五入(不完全等于数学中的四舍五入)
3. let a = 10 / 3 Math.round(a) 使用Math.round进行四舍五入,但对小数不太友好
toFixed的四舍五入不等同于数学中的四舍五入,而是遵循银行家算法的四舍五入,且返回值为字符串,Math.round是数学中的四舍五入,但是对两个小数运算时不太友好,比如:
Math.round(0.1 + 0.2) 得到的是0 Math.round(0.3 + 0.2) 得到的是1
不过可以通过Math.round(num * 10) / 10 进行解决
之后我在MDN里面找到了 Number.EPSILON 这样一个属性,经过我的使用、测试,发现它搭配Math.round可以很好的解决这个问题
Math.round((num + Number.EPSILON) * 100) / 100 这样使用就可以解决精度丢失问题还保留了两位小数
如果想详细了解js为啥会出现精度丢失的话建议参考:这篇文章