JavaScript小数累加异常:多次加0.00001后toFixed输出无变化
问题成因分析
toFixed()方法的返回值为字符串类型,而非数字类型。第一次循环执行完parseFloat(price).toFixed(5)后,price变量已经被赋值为字符串"1.00001",不再是可参与算术运算的数字。- 从第二次循环开始,执行
price = price + 0.00001时会触发 JavaScript 隐式类型转换规则:字符串与数字相加时,会自动将数字转换为字符串执行拼接操作,此时得到的结果是异常字符串"1.000010.00001"。 - 后续执行
parseFloat(price)时,该方法会从左到右解析字符串内容,遇到第一个不符合数字格式的字符(即第二个.)就会终止解析,最终只能解析出数字1.00001,调用toFixed(5)后又回到初始的字符串"1.00001",因此所有循环的输出结果都一致。
代码修复方案
可以将计算逻辑和输出格式化逻辑分离,避免字符串参与算术运算,参考代码如下:
let price = 1 for (let i = 0; i < 10; i++) { price = price + 0.00001; // 仅在输出时做格式化处理,不修改参与计算的变量类型 console.log(price.toFixed(5)); }
如果需要保留精度后再参与后续计算,可以在 toFixed 后手动转回数字类型:
let price = 1 for (let i = 0; i < 10; i++) { price = price + 0.00001; price = Number(price.toFixed(5)); console.log(price.toFixed(5)); }
内容的提问来源于stack exchange,提问作者Daniel Martinez
相关产品推荐
相关产品推荐

