Javascript浮点问题-舍入问题
本文关键字:问题 舍入 Javascript | 更新日期: 2023-09-27 18:07:18
我有一个问题,我的客户端脚本不计算相同的值作为我的服务器端代码:
例如:var x = (2.85 * .1);
alert(x);
结果为0.28500000000000003
然而,我的服务器端代码(c#)计算出0.285的数字,当四舍五入到小数点后2位时,得到0.28
如果我尝试将0.28500000000000003四舍五入到小数点后两位,我得到0.29。
如何让Javascript创建与服务器端代码匹配的图形
看起来我必须进行两次四舍五入——首先去掉后面的3,然后四舍五入到所需的小数点。
例如:var x = 0.2850000000003;
x = parseFloat(x.toFixed(3))
x = x.toFixed(2)
alert(x);
这是最好的解决方法吗?
(这是我之前打开并删除的问题的重新措辞)
。Net使用银行四舍五入。如果一个数字在四舍五入的中点,例如2.5,那么这个数字被四舍五入到最接近的偶数,在这种情况下是2。以这种方式舍入消除了向上舍入所带来的偏差。
你可以在javascript中使用银行家四舍五入:http://snippets.dzone.com/posts/show/1305.
您的c#代码正在使用十进制的基数10,默认情况下使用银行四舍五入。Javascript代码使用以2为基数的浮点运算。这两种形式的计算机算法必然会给出不同的结果。解决方法必须是在两个代码中使用相同的算术方法。
没有double形式的0.285这样的数字。以下是我在JRuby中测试时看到的两个数字:
irb(main):002:0> java.math.BigDecimal.new(0.285).to_s
=> "0.284999999999999975575093458246556110680103302001953125"
irb(main):003:0> java.math.BigDecimal.new(2.85 * 0.1).to_s
=> "0.28500000000000003108624468950438313186168670654296875"
显然,JRuby的行为和JS是一样的。: -)