MidimalRounding的Decimal.Round默认设置

时间:2013-03-14 09:39:00

标签: c# .net rounding

以下适用:

var rounded = Decimal.Round(7.635m, 2);
//rounded: 7.63

对我来说,这是错误和意想不到的行为。我假设舍入的值为 7.64

为实现这一目标,我可以做到:

var rounded = Decimal.Round(7.635m, 2, MidpointRounding.AwayFromZero);
//rounded: 7.64

如何成为Decimal.Round的默认行为?有什么好理由吗?

3 个答案:

答案 0 :(得分:16)

  

这怎么可能不是Decimal.Round的默认行为?好不好   原因是什么?

如果您查看Decimal.Round Method (Decimal)

的文档
  

此方法的行为遵循IEEE标准754第4节。   这种舍入有时被称为圆形的一半甚至或   银行家的四舍五入。它最大限度地减少了由此产生的舍入误差   始终在单个方向上舍入中点值。它是   相当于调用Round(Decimal,MidpointRounding)方法   MidpointRounding.ToEven的模式参数。

答案 1 :(得分:3)

来自Math.Round(Decimal, Int32)方法

  

此方法的行为遵循IEEE标准754第4节   有时候称为四舍五入到最近,或者是银行家   四舍五入。它最大限度地减少了始终如一的舍入误差   在单一方向上舍入中点值。

     

此方法相当于使用模式调用Round方法   MidpointRounding.ToEven的参数。如果有一个非零   d位于小数位小数点右侧的数字及其值   是5,小数位的数字如果是奇数则向上舍入,   如果是偶数则保持不变。如果d的小数位数小于   小数,d不变。

答案 2 :(得分:0)

原因是他们实施了遵循IEEE标准754第4节的方法。 这被称为四舍五入到最近或有时银行家四舍五入。

这只是进行四舍五入的众多方法之一,他们选择了这个。 请参阅:http://en.wikipedia.org/wiki/Bankers_rounding

有关更多信息:Why does .NET use banker's rounding as default?