我想在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
????
答案 0 :(得分:1)
根据@ scott.korin评论已更改
Math.round( 1.27532423 * 100 ) / 100
到
Math.round( 1.27532423 * 10 * 10) / 100 // changed 100 to 10*10
它就像一个魅力:)
谢谢!
答案 1 :(得分:0)
浮点数学仅精确到52nd binary place(大约是第16个十进制数)。虽然1.275应该向上舍入到1.28,但1.01000110011b == 1.274902d正确地向下舍入到1.27。
答案 2 :(得分:0)
答案 3 :(得分:0)
为了避免这个浮点数舍入误差,我会将最大精度乘以10 ^ 21,如下所示
Math.round(1.275*Math.pow(10,21)/Math.pow(10,19))/100 == 1.28