📜  float js 精度 - Javascript (1)

📅  最后修改于: 2023-12-03 14:41:14.464000             🧑  作者: Mango

浮点数精度问题 in JavaScript

在 JavaScript 中,浮点数精度问题是常见的问题。由于技术限制,JavaScript 中的数字都以 IEEE-754 标准双精度浮点数表示。因此,像小数一样的数字值会被四舍五入为最接近的可表示数字值。

以下是一些示例代码,展示了浮点数精度问题的不同情况。

0.1 + 0.2 // 0.30000000000000004
0.1 + 0.7 // 0.7999999999999999
1.0 - 0.9 // 0.09999999999999998

如何解决这个问题? 以下是几种常用的解决方法。

1. 将浮点数转化为整数进行操作

可以尝试将浮点数转换为整数,然后进行计算。这种解决方法可以解决一些简单的问题。例如,可以将 0.1 转化为 1,将 0.2 转化为 2,将 /10 操作转化为 /100 操作。

(0.1 * 10 + 0.2 * 10) / 10 // 0.3
2. 使用 JavaScript 库

可以使用一些专门处理浮点数精度问题的 JavaScript 库来解决问题。例如,Big.js 和 math.js 都提供了精度更高的计算方法。

const big = require('big.js')

big(0.1).plus(0.2).toString() // 0.3
3. 四舍五入

使用 toPrecision()toFixed() 方法可以将数字四舍五入到指定的位数。例如,可以将数字四舍五入到两个小数位数,以获得比较高的精度。

(0.1 + 0.2).toPrecision(2) // 0.30
(0.1 + 0.2).toFixed(2) // 0.30

但是需要注意的是,这种方法只是解决了输出问题,如果需要进行后续计算,仍需要进行浮点数转整数的操作。

4. 判断相等

为了解决精度问题,我们可以比较两个数字之间的误差是否低于某个阈值,来判断它们是否相等。

function isEqual(a, b) {
  return Math.abs(a - b) < Number.EPSILON
}

isEqual(0.1 + 0.2, 0.3) // true
总结

每种解决方法都有其优点和缺点。如果您需要高精度的数值计算,那么使用 JavaScript 库可能是最好的选择。否则,将浮点数转化为整数进行操作可能是更快捷的方式。