我从阅读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#,并且想知道在舍入数字后我能够得到相同的结果
答案 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
。