h5打开以查看
问题原因
JavaScript 使用 IEEE 754 双精度浮点数格式来表示数字,这种格式在二进制中无法精确表示某些十进制小数。
具体分析
javascript
// 40.62 在二进制中无法精确表示
console.log("40.62 的实际存储值:", 40.62);
// 实际存储的可能是:40.619999999999997
// 当乘以 100 时,精度误差被放大了
console.log("40.62 * 100 =", 40.62 * 100);
// 结果:4061.9999999999995
解决方案
方案1:使用 toFixed() 和 parseFloat
javascript
let value = "40.62"; let result = parseFloat(value) * 100; console.log(result.toFixed(2)); // "4062.00" console.log(parseFloat(result.toFixed(2))); // 4062
方案2:四舍五入到指定小数位
javascript
let value = "40.62"; let result = parseFloat(value) * 100; let rounded = Math.round(result * 100) / 100; // 保留2位小数 console.log(rounded); // 4062
方案3:使用整数运算(推荐)
javascript
let value = "40.62";
// 将小数转换为整数进行计算
let parts = value.split('.');
let integerPart = parseInt(parts[0]) * 100;
let decimalPart = parseInt(parts[1] || 0);
let result = integerPart + decimalPart;
console.log(result); // 4062
方案4:使用第三方库
对于财务计算等需要高精度的场景,建议使用专门的库:
javascript
// 使用 decimal.js
// import { Decimal } from 'decimal.js'
let result = new Decimal("40.62").times(100).toNumber();
console.log(result); // 4062
个人建议
javascript
function safeMultiply(value, multiplier) {
return parseFloat((parseFloat(value) * multiplier).toFixed(10));
}
console.log(safeMultiply("40.62", 100)); // 4062
这种浮点数精度问题是所有使用 IEEE 754 标准的编程语言(包括 JavaScript、Java、Python 等)都会遇到的常见问题。


571

被折叠的 条评论
为什么被折叠?



