为什么小数2.5M轮到2?

时间:2016-10-17 20:14:17

标签: c# .net vb.net math

我必须错过.NET舍入的一些微妙之处。所以我看这个例子:

decimal num = 2.5M;
var result = Math.Round(num);

为什么result = 2? (我本来应该预期3,因为它应该围捕)

2 个答案:

答案 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