Javascript的Math.Round和C#Math.Round有多接近?
我从阅读中了解到,编译器将查看您的数字,确定中点是偶数还是奇数,然后返回偶数。示例编号为2.5,四舍五入为3。我已经尝试了我自己的小实验来看看会发生什么,但我还没有找到任何关于这方面的规范,甚至没有找到浏览器之间是否一致的规范 下面是一个使用jQuery显示的JavaScript片段示例:Javascript的Math.Round和C#Math.Round有多接近?,javascript,c#,rounding,Javascript,C#,Rounding,我从阅读中了解到,编译器将查看您的数字,确定中点是偶数还是奇数,然后返回偶数。示例编号为2.5,四舍五入为3。我已经尝试了我自己的小实验来看看会发生什么,但我还没有找到任何关于这方面的规范,甚至没有找到浏览器之间是否一致的规范 下面是一个使用jQuery显示的JavaScript片段示例: $(document).ready(function() { $("#answer").html(showRounding()); }); function showRounding() {
$(document).ready(function() {
$("#answer").html(showRounding());
});
function showRounding() {
var answer = Math.round(2.5);
return answer;
}
这将返回一个“3”
我想知道的是:JavaScript中的四舍五入与C#等价物有多接近?我之所以这样做是因为我想使用一个JavaScript方法,它使用Math.Round
并将相同的方法重写为C#,并且想知道在对一个数字进行舍入后,我能够得到相同的结果。这里是关于Math.Round(x)
:
15.8.2.15四舍五入(x)返回最接近x的数值,并且
等于一个数学整数。如果
两个整数值相等
接近x,则结果为
接近的数值+∞. 如果
x已经是一个整数,结果是
十,
- 如果x为NaN,则结果为NaN
- 如果x为+0,则结果为+0
- 如果x是−0,结果是−0
- 如果x是+∞, 结果是+∞.李>
- 如果x是−∞, 结果是−∞.李>
- 如果x大于0但小于 0.5,结果为+0
- 如果x小于0但大于或等于-0.5,则结果 是−0
没有规定任何特定的舍入算法。我们拥有的最接近的东西是.NET的文档。从这一点上,您可以看到一些javascript案例不适用(
Math.Round
只处理小数和双精度,而不是无穷大),该方法的重载让您对结果有了更多的控制—您可以指定结果中的小数位数和中点舍入方法。默认情况下,Math.Round
使用“银行家舍入”(到偶数)。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
,您是对的。请再看一看C#,您应该使用Round with middpointrounding.AwayFromZero使您的业务分析师和簿记员感到高兴。看起来,默认情况下,C#Round是使用银行家四舍五入和中点四舍五入。当然,在C#中,使用十进制表示货币。虽然不确定这在Javascript中有多准确,但无论如何你不应该依赖Javascript——服务器是权威。