精度

Posted on Nov 12, 2020

遇到的问题

在 JS 中计算数字经常会遇到精度的问题。使一些判断语句出现bug。

1.1 * 100 === 110
// 110.00000000000001

0.1 + 0.2 === 0.3
// 0.30000000000000004

解决方法

不使用严格相等(==或===)来做判断,容忍两个数之间有一个很小的误差。

function eq(left, right) {
  Math.abs(left - right) < 0.000001
}

原理

比如正常的比较,0.1 + 0.2 === 0.3 相当于 0.1 + 0.2 - 0.3 === 0 。bug就出现在不是等于零,而是一个很小很小的数。这个很小很小的数就使误差。如果误差在可接受范围内,我们就还可以认为它们使相等的。

这个误差,可以通过 Number.EPSILON1 来设置。具体设置成多少我还不知道,可能要根据做的业务的情况来确定吧。

function eq(left, right) {
  return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 10)
}

  1. 阮一峰.ECMAScript 6 入门.[2020年11月12日] ↩︎