在C#中,Math.Round(2.5)的结果为2。

应该是3,不是吗?为什么在C#中改为2?

最佳答案

首先,无论如何这都不是C#错误-而是.NET错误。 C#是语言-它不决定Math.Round的实现方式。

其次,否-如果您阅读the docs,则会看到默认的舍入是“舍入到偶数”(银行的舍入):



您可以使用an overload值指定 Math.Round 来指定MidpointRounding如何舍入中点。有一个与每个过载对应的MidpointRounding重载,其中没有一个:

  • Round(Decimal) / Round(Decimal, MidpointRounding)
  • Round(Double) / Round(Double, MidpointRounding)
  • Round(Decimal, Int32) / Round(Decimal, Int32, MidpointRounding)
  • Round(Double, Int32) / Round(Double, Int32, MidpointRounding)

  • 是否选择了默认值是另一回事。 (MidpointRounding仅在.NET 2.0中引入。在此之前,我不确定是否有任何简单的方法可以自行实现所需的行为。)特别地,历史表明,这不是预期的行为-在大多数情况下这是API设计的主要罪过。我可以看到“银行家四舍五入”为何有用...但是,这仍然令许多人感到惊讶。

    您可能有兴趣查看提供更多选项的最近的Java等效枚举( RoundingMode )。 (它不仅处理中点。)

    08-19 22:35