主题
JS 浮点数精度问题示例
JavaScript 使用 IEEE 754 标准的双精度浮点数来表示所有数字,这导致某些十进制小数在二进制中无法精确表示,从而产生了常见的精度问题。
常见问题示例
js
console.log(0.1 + 0.2); // 输出: 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // 输出: false
console.log(0.3 - 0.2); // 输出: 0.09999999999999998
console.log(0.3 - 0.2 === 0.1); // 输出: false
console.log(0.1 * 0.2); // 输出: 0.020000000000000004
console.log(0.3 / 0.1); // 输出: 2.9999999999999996
这些看似简单的数学运算,结果都不等于我们预期的精确数值。
为什么会出现这种情况?
这是因为计算机内部采用二进制浮点数表示,而很多十进制小数无法用有限的二进制位精确表达。例如十进制小数 0.1
的二进制表示是一个无限循环小数,计算机只能截断它,造成了误差。
浮点数精度问题带来的影响
比较失败 直接用
===
比较浮点数时,可能因为微小误差导致判断错误。累积误差 多次浮点运算会让误差逐渐累积,最终结果偏离实际。
业务逻辑错误 在财务、计量等要求高精度的场景中,误差可能导致金额差错,造成严重损失。
示例:简单金额计算问题
js
const price = 0.1;
const quantity = 3;
const total = price * quantity;
console.log(total); // 预期 0.3,但实际输出 0.30000000000000004
console.log(total === 0.3); // false
解决方案
为避免这些问题,可以使用专门的高精度数学库,如 decimal.js
,它能在底层实现十进制运算,准确表达小数,避免误差。