为什么Math.Round()在十进制1100之后改变MidpointRounding

时间:2016-08-09 07:34:22

标签: c# .net

有人可以向我解释为什么以下代码在两种情况下输出1100?

decimal toEven = 1100.5m;
decimal awayFromZero = 1099.5m;

Console.WriteLine(Math.Round(toEven)); // output 1100
Console.WriteLine(Math.Round(awayFromZero)); // output 1100

看起来Math.Round()会在数字1100之后更改MidpointRounding策略。如果在小于1100的小数点上使用Math.Round(),使用.5十进制Math.Round()默认情况下使用AwayFromZero MidpointRounding。但是如果使用超过1100的小数,Math.Round()将默认使用ToEven MidpointRound。为什么呢?

我知道我可以设置MidpointRounding我自己解决问题。我只是好奇为什么Math.Round()会像这样工作。

1 个答案:

答案 0 :(得分:3)

  

我只是好奇为什么Math.Round()会像这样工作。

因为这是设计and documented的行为方式:

  

如果 d 的小数分量在两个整数之间,其中一个是偶数,另一个是奇数,则返回偶数。

行为也不会在1100左右发生变化,Math.Round(1097.5m)Math.Round(1098.5m)都会返回1098。