Javascript Math.Round与C#Math.Round有多接近?

时间:2009-12-07 21:24:33

标签: javascript c# rounding

我从阅读this Stackoverflow question开始就知道,编译器会查看你的号码,判断中点是偶数还是奇数,然后返回偶数。示例数字是2.5,舍入为3.我尝试了自己的小实验,看看会发生什么,但我还没有找到任何关于此的规范,或者即使它在浏览器之间是一致的。

以下是使用jQuery进行显示的示例JavaScript代码段:

$(document).ready(function() {
    $("#answer").html(showRounding());
});

function showRounding() {
    var answer = Math.round(2.5);
    return answer;
}

返回'3'。

我想知道的是:JavaScript与C#等效的四舍五入有多接近?我这样做的原因是因为我想采用一种使用Math.Round的JavaScript方法并将相同的方法重写为C#,并且想知道在舍入数字后我能够得到相同的结果

2 个答案:

答案 0 :(得分:5)

这是Math.round(x)的{​​{3}}:

  

15.8.2.15 round(x)返回最接近x且为的Number值   等于数学整数。如果   两个整数数值相等   接近x,然后结果是   数值接近+∞。如果   x已经是整数,结果是   X

     
      
  • 如果x是NaN,则结果为NaN。
  •   
  • 如果x为+0,则结果为+0。
  •   
  • 如果x为-0,则结果为-0。
  •   
  • 如果x为+∞,则结果为+∞。
  •   
  • 如果x为-∞,则结果为-∞。
  •   
  • 如果x大于0但小于   0.5,结果是+0。
  •   
  • 如果x小于0但大于或等于-0.5,则结果   是-0。
  •   
     

注意1 Math.round(3.5)返回4,但是   Math.round(-3.5)返回-3。

     

注2:Math.round(x)的值为   与价值相同   Math.floor(x + 0.5),除非x是-0   或小于0但大于或   等于-0.5;对于这些案件   Math.round(x)返回-0,但是   Math.floor(x + 0.5)返回+0。

the complete javascript specification没有规定任何特定的舍入算法。我们最接近的是.NET The C# Language Specification的文档。从那里,您可以看到一些javascript案例不适用(Math.Round仅处理小数和双精度,而不是无穷大),并且方法的重载使您可以更好地控制结果 - 您可以指定结果中的小数位数和中点舍入方法。默认情况下,Math.Round使用“银行家舍入”(甚至)。

答案 1 :(得分:3)

ECMAScript的舍入基本上是天真的asymmetric rounding(添加了对+-Infinity的检查)。 WRT将您的JavaScript代码移植到C#,您可能最好避免使用.NET Math.Round(因为它是always symmetric)而使用Math.Floor代替:

double d = -3.5d;
double rounded = Math.Floor(d + 0.5); // -3 matches JavaScript's Math.round

也就是说,如果您想要严格模拟ECMAScript的Math.round