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

9
我从阅读这个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#,并且想知道在对数字进行四舍五入后我能够获得相同的结果。

2个回答

7

这里是关于Math.round(x)完整的JavaScript规范

15.8.2.15 round(x) 返回最接近x且等于数学整数的数字值。如果两个整数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使用“银行家舍入”(到偶数)。


5

ECMAScript的舍入基本上是天真的非对称舍入(同时添加了对+-Infinity的检查)。如果要将您的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函数。

你是对的。请再看一下 https://dev59.com/aXI-5IYBdhLWcg3wZ3jC#1870487 - cletus
在C#中,您应该使用MidpointRounding.AwayFromZero舍入以使您的业务分析师和簿记员满意。似乎默认情况下,C#Round使用MidpointRounding.Even的银行家舍入法。当然,在C#中使用Decimal来处理货币。不确定在Javascript中这会有多准确,但是无论如何,您都不应该依赖Javascript - 服务器是权威。 - JustAMartin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接