我的客户端脚本无法计算与服务器端代码相同的值时遇到问题:
例如:
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);
这是最好的解决方法吗?
(这是我之前打开并删除的问题的重写措辞)
答案 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的行为相同。 : - )