【问题标题】:Decimal.Round default setting for MidpointRounding [duplicate]MidpointRounding 的 Decimal.Round 默认设置 [重复]
【发布时间】:2013-03-02 14:08:30
【问题描述】:

以下适用:

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的默认行为?有什么好的理由吗?

【问题讨论】:

  • 看看stackoverflow.com/a/977807/525138,我觉得你不能改默认的。
  • 我想他们选择了这个作为默认值,因为大多数小数的四舍五入都是在货币上完成的。不幸的是,它也是 double.Round() 的默认值,它确实填满了很多数学计算——尤其是与计算像素坐标有关的计算。
  • 有没有人注意到默认的舍入到偶数在你的例子中舍入到奇数?!!我在一台机器上发现了这种(错误?)行为,但在另一台机器上却没有。 anody 知道发生了什么事吗?
  • 很奇怪,因为在 .NET Core 中 decimal.Round(7.635m, 2); 给出了 7.64

标签: c# .net rounding


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,这很有道理! :)
  • @ErikKinding,不客气
  • 这确认了默认值,但与 OP 的第一个示例不符。为什么它四舍五入为奇数?我自己也经常遇到这种行为,我无法解释。
  • @Timo 你能提供什么时候发生这种情况的例子吗?
  • @ErikKinding 一年了!不幸的是,我没有例子了。我的机器按预期从Decimal.Round(7.635m, 2) 生成7.64,我明白了。你的仍然像你原来的帖子那样产生7.63吗?
【解决方案2】:

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

此方法的行为遵循 IEEE 标准 754 第 4 节。 一种舍入有时称为四舍五入到最近的,或银行家的 四舍五入。它最大限度地减少了由一致导致的舍入误差 在一个方向上舍入一个中点值。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-06-28
      • 1970-01-01
      • 2016-09-06
      • 2014-07-11
      • 2017-06-26
      • 1970-01-01
      • 2018-12-04
      • 2023-03-26
      • 2013-08-02
      相关资源
      最近更新 更多