1

我想在javascript中将数字四舍五入到小数点后两位。我发现很多关于 SO 的帖子都说.toFixed方法的行为对于不同的浏览器是不可预测的。

并在许多地方找到了这个解决方案,无一例外地被接受

Math.round(yournumber * 100 ) / 100

但是我从这个计算中也发现了正确但一些错误的结果,比如

Math.round( 1.27532423 * 100 ) / 100  = 1.28 // this seems correct
Math.round( 1.275 * 100 ) / 100       = 1.27 // as I understand it should also 1.28
Math.round( 1.276 * 100 ) / 100       = 1.28 

我是否遗漏了什么或我的理解不正确?

编辑

才发现

1.275 * 100正在返回127.49999999999999,这就是原因,如果它返回127.5,它将产生正确的结果。

但是为什么它会返回这个127.49999999999999????

4

4 回答 4

1

根据@scott.korin 评论已更改

Math.round( 1.27532423 * 100 ) / 100

Math.round( 1.27532423 * 10 * 10) / 100 // changed 100 to 10*10 

它就像一个魅力:)

谢谢!

于 2013-03-14T04:14:44.757 回答
0

浮点数学仅精确到第52 位二进制位(大约是第 16 位小数)。虽然 1.275 应该向上舍入到 1.28,但 1.01000110011b == 1.274902d 正确地向下舍入到 1.27。

于 2013-03-14T03:47:23.507 回答
0

这是该问题的解决方法:

Math.round((1.275*100).toFixed(2))/100 // returns 1.28

问题的解释可以在下面的问答中找到

于 2013-03-14T04:20:45.967 回答
0

为避免此浮点数舍入错误,我将最大精度乘以 10^21,如下所示

Math.round(1.275*Math.pow(10,21)/Math.pow(10,19))/100 == 1.28
于 2013-03-14T04:50:46.443 回答