有人可以向我解释为什么以下代码在两种情况下输出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()会像这样工作。
答案 0 :(得分:3)
我只是好奇为什么Math.Round()会像这样工作。
因为这是设计and documented的行为方式:
如果 d 的小数分量在两个整数之间,其中一个是偶数,另一个是奇数,则返回偶数。
行为也不会在1100左右发生变化,Math.Round(1097.5m)
和Math.Round(1098.5m)
都会返回1098。