如何解决为什么 Math.Round(2.5) 返回 2 而不是 3?
首先,这无论如何都不会是 C# 错误 - 它将是 .NET 错误。C# 是语言 - 它不决定如何Math.Round
实现。
其次,不 - 如果您阅读文档,您会看到默认舍入是“舍入到偶数”(银行家的舍入):
类型:System.Double 最接近 a 的整数。如果 a 的小数部分介于两个整数之间,其中一个为偶数,另一个为奇数,则返回偶数。请注意,此方法返回 a
Double
而不是整数类型。此方法的行为遵循 IEEE 标准 754 第 4 节。这种舍入有时称为四舍五入或银行家四舍五入。它可以最大限度地减少因在单个方向上持续舍入中点值而导致的舍入误差。
您可以使用带值的重载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
),它提供了更多选项。(它不只是处理中点。)
解决方法
在 C# 中, 的结果Math.Round(2.5)
是 2。
应该是3吧?为什么在 C# 中是 2?