Appearance
精度问题
本节目标:理解“精度问题”的核心思路,并能把它用于实际开发或面试表达。 是的,JavaScript 中的乘法运算可能会遇到精度问题,特别是在处理浮点数时。 为什么会发生精度问题 JavaScript 使用 IEEE 754 标准的 64 位双精度浮点数来表示所有数字(包括整数和小数),这会导致:
- 某些小数无法精确表示:例如 0.1 + 0.2 ≠ 0.3
- 大整数可能丢失精度:当数字超过 2^53 (约 9千万亿) 时
乘法精度问题示例 javascript console.log(0.1 * 0.2); // 0.020000000000000004 而不是 0.02console.log(1.005 * 100); // 100.49999999999999 而不是 100.5console.log(12345678901234567 * 10); // 123456789012345680 而不是 123456789012345670 解决方案
- 使用 toFixed() 方法(注意这会返回字符串):javascript(0.1 * 0.2).toFixed(2); // "0.02"
- 转换为整数计算后再转换回去:javascriptfunction multiply(a, b) { const factor = Math.pow(10, Math.max(getDecimalLength(a), getDecimalLength(b))); return (a * factor) * (b * factor) / (factor * factor);}function getDecimalLength(num) { const decimal = num.toString().split('.')[1]; return decimal ? decimal.length : 0;}
- 使用第三方库:
- decimal.js
- big.js
- math.js
- 对于大整数,使用 BigInt(ES2020 引入):javascriptconst bigNum = BigInt(12345678901234567) * 10n;
最佳实践
- 对于金融计算等需要高精度的场景,始终使用专门的库
- 了解你的数字范围,必要时使用 BigInt
- 显示结果时使用 toFixed() 或类似方法进行格式化
JavaScript 的这种行为并非缺陷,而是 IEEE 754 浮点数标准的特性,大多数编程语言都有类似问题。 > 来自 <https://chat.deepseek.com/a/chat/s/0a20c85b-861b-4985-9c0e-fb77f8517885> > 来自 <https://chat.deepseek.com/a/chat/s/0a20c85b-861b-4985-9c0e-fb77f8517885>
