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

Chr*_*ris 7 javascript c# rounding

通过阅读Stackoverflow问题,我知道编译器将查看您的号码,确定中点是偶数还是奇数,然后返回偶数.示例数字是2.5,其四舍五入到3.我已经尝试了我自己的小实验来看看会发生什么,但我还没有找到任何关于此的规范,或者即使它在浏览器之间是一致的.

这是一个使用jQuery进行显示的示例JavaScript代码段:

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

function showRounding() {
    var answer = Math.round(2.5);
    return answer;
}
Run Code Online (Sandbox Code Playgroud)

这返回'3'.

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

Jef*_*nal 5

下面是完整的JavaScript规范Math.round(x):

15.8.2.15 round(x)返回最接近x并且等于数学整数的Number值.如果两个整数Number值同样接近x,则结果是Number值更接近+∞.如果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.

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


Cre*_*esh 5

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

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

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