2026-10-22 16:23:05
JavaScript 中浮点数累加出现精度问题是由于计算机以二进制存储数据,而部分十进制小数无法被精确转换为二进制,导致计算时出现微小误差。以下是具体原因和解决方案:
一、问题原因IEEE 754 标准限制JavaScript 的 Number 类型遵循 IEEE 754 双精度浮点数规则,用 64 位存储数据。十进制小数(如 0.1)在转换为二进制时可能成为无限循环小数(如 0.1 → 0.0001100110011...),导致存储时被截断,产生精度损失。
累加误差累积多次运算后,微小误差会累积(如 0.1 + 0.2 得到 0.30000000000000004),尤其在循环或大量计算中更明显。
问题代码(购物车总价计算错误):
let total = 0;const items = [ { price: 5.55, count: 2 }, { price: 3.33, count: 1 }];items.forEach(item => total += item.price * item.count);console.log(total); // 14.429999999999998修复代码(使用方法 2):
function addPrice(a, b) { const factor = 100; return (Math.round(a * factor) + Math.round(b * factor)) / factor;}let fixedTotal = 0;items.forEach(item => { const itemTotal = item.price * item.count; fixedTotal = addPrice(fixedTotal, itemTotal);});console.log(fixedTotal); // 14.43四、总结与建议选择方案:
简单计算 → toFixed()。
价格/金额 → 整数化运算。
高精度需求 → decimal.js。
最佳实践:
金融计算优先用“分”为单位存储(如数据库存 999 表示 9.99 元)。
展示结果时用 toFixed(2) 格式化(如 total.toFixed(2))。
关键步骤打印日志,及时验证中间结果。
通过以上方法,可有效避免 JavaScript 浮点数运算的精度问题,确保计算结果准确可靠。