繁体   English   中英

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

[英]How Close is the Javascript Math.Round to the C# Math.Round?

通过阅读Stackoverflow问题 ,我知道编译器将查看您的号码,确定中点是偶数还是奇数,然后返回偶数。 示例数字是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#,并希望知道在舍入数字后我能得到相同的结果。

这是Math.round(x) 的完整javascript规范

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使用'银行家舍入'(甚至)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM