我必须错过.NET舍入的一些微妙之处。所以我看这个例子:
decimal num = 2.5M;
var result = Math.Round(num);
为什么result = 2
? (我本来应该预期3,因为它应该围捕)
答案 0 :(得分:7)
请参阅MSDN:
十进制Math.Round(Decimald)
将十进制值舍入为最接近的整数,并舍入中点 值到最近的偶数(例子)。
“中点”在这里表示.5
;您案例中的偶数为2
。如果您以这种方式舍入3.5
,则会产生4
。
如果您想使用“远离零”舍入,则可以使用the System.MidpointRounding.AwayFromZero
enum:
decimal d = 2.5M;
decimal roundedD = Math.Round(d, MidpointRounding.AwayFromZero); // results in 3
关于为什么它默认使用中点舍入(AKA“银行家舍入”)而不是“远离零”舍入,see this answer。据说它是一种更好的算法(即在许多次迭代中效率更高)。
答案 1 :(得分:4)
如果你想要经典的舍入使用
if ( i == 5 ) {
x = foo;
y = foo + 1;
} else {
x = bar;
y = bar + 1;
}
有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/system.math.round(v=vs.110).aspx