Javascript浮点问题-舍入问题

Javascript floating point problem - Rounding issue?

本文关键字:问题 舍入 Javascript      更新时间:2023-09-26

我有一个问题,我的客户端脚本不计算相同的值作为我的服务器端代码:

例如:

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是一样的。: -)