Javascript解析int舍入问题

时间:2017-06-16 17:18:23

标签: javascript

如果我执行以下操作:

parseInt(parseFloat(9.20)*100*1)/100 // returns 9.19

当我希望它返回9.20时,它返回9.19我需要更改什么才能让它返回正确的值?

当我将其更改为:

时,我遇到了同样的问题
parseInt(parseFloat(9.12)*100*1)/100 // returns 9.11

但任何其他价值都可行:

parseInt(parseFloat(9.30)*100*1)/100 // returns 9.30 (correct)

更新:

解决方案是:

(Math.round(9.20*100*1)/100).toFixed(2)

2 个答案:

答案 0 :(得分:1)

问题是,由于浮点错误,Javascript中的9.20*100会返回919.9999999999999而不是920。当你对parseInt()进行操作时,它不会舍入到最近的int,而是将其截断为919,这就是为什么你的最终答案是错误的。

不使用parseInt(),而是使用Math.round()更好的方法。此方法舍入到最近的int,将919.99999转换为920,为您提供正确的答案。

答案 1 :(得分:0)

因为JavaScript使用二进制算术,所以浮点数学是基数10结果的近似值。

避免这种情况的一种方法是执行积分数学运算,但是将小数乘以一个足够大的因子,将它们转换为整数,然后将答案分成相同的因子。

在这种情况下,我不确定您使用parseInt()parseFloat()的原因,因为您首先不使用字符串。

最后,当您使用parseInt()时,建议使用第二个(可选)参数并提供基数(用于执行操作的基础数字系统),因为您可以在返回时获得不正确的值要解析的字符串以“0”或“0x”开头。

var result = parseInt(9.2*10, 10)/10 // returns 9.19

console.log(result);