如何解决js处理数字时的浮点数精度问题

101 阅读1分钟

1.如果需要高精度计算,使用专门的库是最佳选择

decimal.jsbignumber.jsmath.js,提供了高精度的十进制运算功能。这些库可以处理任意精度的十进制数,非常适合需要高精度计算的场景

2.只需要处理简单的精度问题,使用四舍五入或容错范围可能是足够的

四舍五入整数:

使用Math.round()、Math.floor()、Math.ceil()进行四舍五入

Math.round():四舍五入一个数字到最接近的整数

Math.floor():向下舍入,返回不大于一个给定数字的最大整数

Math.ceil():向上舍入,返回大于或等于一个给定数字的最小整数

四舍五入到特定的小数位数:

toFixed()

3.使用整数进行计算

如果可能的话,尽量将数值乘以一个因子转换成整数进行计算,最后再除以相同的因子得到最终结果。这样可以避免浮点数运算中的精度问题

4. 比较浮点数时使用容错范围

由于浮点数的精度问题,最好不要直接比较两个浮点数是否相。应该检查它们之间的差的绝对值是否小于一个很小的数(即容错范围)。

function areFloatsEqual(num1, num2, epsilon = 0.00001) {  
  return Math.abs(num1 - num2) < epsilon;  
}

5.避免使用浮点数进行循环或递增

最好避免在循环中递增一个浮点数,浮点数的递增可能会导致不可预见的结果,因为不是所有的小数都可以精确地用二进制浮点数表示