本文解析为何对 0.2 和 0.1 执行 ×10 再 ÷10 并不能真正“解决”浮点误差,而只是偶然掩盖了问题;强调可靠方案应是显式舍入(如 math.round),并说明其原理与适用边界。
JavaScript 中 0.2 + 0.1 !== 0.3 是经典浮点精度问题:二进制无法精确表示十进制小数(如 0.1 的二进制是无限循环小数 0.0001100110011…₂),导致计算结果出现微小偏差(0.30000000000000004)。
表面上看,let y = (0.2 * 10 + 0.1 * 10) / 10 得到 0.3,似乎“修复”了问题——但这并非普适解法,而是巧合。原因在于:
⚠️ 更危险的是:该方法在其他数值上极易失效。例如:
let a = 0.29 * 10; // 2.8999999999999995 let b = 0.01 * 10; // 0.10000000000000002 console.log((a + b) / 10); // 0.30000000000000004 —— 仍未修正
✅ 真正可靠的方案是显式控制精度:先放大、再舍入、最后还原:
// 正确做法:对中间结果使用 Math.round 确保整数精度
let y = (Math.round(0.2 * 10) + Math.round(0.1 * 10)) / 10;
// → (2 + 1) / 10 = 0.3 (数值层面严格等于 0.3)
// 通用函数(支持任意小数位)
function addFloat(a, b, decimal = 1) {
const factor = 10 ** decimal;
return (Math.round(a * factor) + Math.round(b * factor)) / factor
;
}
console.log(addFloat(0.2, 0.1)); // 0.3
console.log(addFloat(0.29, 0.01, 2)); // 0.30? 总结: