JavaScript的数字为小数点后两位,数字为10.435,10.425是特殊情况吗?

时间:2017-09-05 05:25:07

标签: javascript html math

这个问题有解决办法吗?

我不想使用if / else。

10.435.toFixed(2); => "10.43" //Wrong, should be '10.44'
10.425.toFixed(2); => "10.42" //Wrong, should be '10.43'
10.415.toFixed(2); => "10.42"
10.445.toFixed(2); => "10.45"

parseFloat(10.415).toFixed(2); => "10.42" //Wrong, should be '10.44'
parseFloat(10.425).toFixed(2); => "10.42" //Wrong, should be '10.43'
parseFloat(10.435).toFixed(2); => "10.43"
parseFloat(10.415).toFixed(2); => "10.42"

Math.round(10.435*100)/100 => 10.43 //Wrong, should be '10.44'
Math.round(10.425*100)/100 => 10.42 //Wrong, should be '10.43'
Math.round(10.415*100)/100 => 10.42
Math.round(10.445*100)/100 => 10.45

1 个答案:

答案 0 :(得分:0)

您可以尝试将此作为将正数x四舍五入到小数点后两位的解决方法。

Math.floor(x*100+0.5)/100);

我可以找到舍入预期值之间行为的最佳推理是ECMA script standard中的注释(#2)。

即使使用64位,也无法代表所有内容;不过,我对这里的舍入错误感到有些惊讶。

对于正数或负数,更常见的解决方法是:

Math.floor(x*Math.pow(10,2)+Math.sign(x)*0.5)*Math.pow(10,-2));

并且您可以更改2以匹配要舍入的小数位数。