精度
遇到的问题
在 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.EPSILON
1 来设置。具体设置成多少我还不知道,可能要根据做的业务的情况来确定吧。
function eq(left, right) {
return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 10)
}
-
阮一峰.ECMAScript 6 入门.[2020年11月12日] ↩︎