Javascript浮点问题 - 舍入问题?

时间:2011-09-01 11:58:02

标签: c# javascript

我的客户端脚本无法计算与服务器端代码相同的值时遇到问题:

例如:

var x = (2.85 * .1);
alert(x);

这给出了0.28500000000000003的数字

但是我的服务器端代码(C#)计算的数字是0.285,当舍入到2位小数时会得到0.28

如果我尝试将0.28500000000000003舍入到2位小数,我得到0.29。

如何让我的Javascript创建一个与我的服务器端代码匹配的数字。

看起来我必须经历2次舍入 - 首先删除尾随3,然后舍入到所需的小数位。

例如:

var x = 0.2850000000003;
x = parseFloat(x.toFixed(3))
x = x.toFixed(2)
alert(x);

这是最好的解决方法吗?

(这是我之前打开并删除的问题的重写措辞)

3 个答案:

答案 0 :(得分:5)

.Net使用banker's rounding。如果数字位于四舍五入中点,例如2.5然后将数字四舍五入到最接近的偶数,在这种情况下2.以这种方式舍入消除了向上舍入引入的偏差。

您可以使用http://snippets.dzone.com/posts/show/1305上的代码段在javascript中使用银行家四舍五入。

答案 1 :(得分:2)

您的C#代码使用基数10十进制类型,默认情况下使用银行家四舍五入。 Javascript代码使用base 2浮点算法。这两种形式的计算机算术本身会产生不同的结果。解决方案必须是在两个代码中使用相同的算术方法。

答案 2 :(得分:0)

双倍中没有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的行为相同。 : - )