22

以下适用:

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

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

为此,我可以这样做:

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

这怎么可能不是的默认行为Decimal.Round?这有什么好的理由吗?

4

3 回答 3

19

这怎么可能不是 Decimal.Round 的默认行为?这有什么好的理由吗?

如果您查看Decimal.Round Method (Decimal)的文档

此方法的行为遵循 IEEE 标准 754 第 4 节。这种四舍五入有时被称为四舍五入银行家四舍五入。它可以最大限度地减少因在单个方向上持续舍入中点值而导致的舍入误差。它相当于调用带有 MidpointRounding.ToEven 模式参数的 Round(Decimal, MidpointRounding) 方法。

于 2013-03-14T09:40:28.083 回答
3

Math.Round(Decimal, Int32)方法

此方法的行为遵循 IEEE 标准 754 第 4 节。这种四舍五入有时称为四舍五入或银行家四舍五入。它可以最大限度地减少因在单个方向上持续舍入中点值而导致的舍入误差。

此方法等效于调用带有 MidpointRounding.ToEven 模式参数的 Round 方法。如果 d 中小数点右侧有一个非零数字且其值为 5,则小数点位置的数字如果是奇数则四舍五入,如果是偶数则保持不变。如果 d 的小数位数少于小数,则 d 原样返回。

于 2013-03-14T09:41:26.563 回答
0

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

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

更多信息:为什么 .NET 使用银行家的舍入作为默认值?

于 2013-03-14T09:49:34.157 回答