在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
)。 (它不仅处理中点。)