Dot-Net

為什麼 Math.Round(2.5) 返回 2 而不是 3?

  • June 10, 2009

在 C# 中, 的結果Math.Round(2.5)是 2。

應該是3吧?為什麼在 C# 中是 2?

首先,這無論如何都不會是 C# 錯誤 - 它將是 .NET 錯誤。C# 是語言 - 它不決定如何Math.Round實現。

其次,不 - 如果您閱讀文件,您會看到預設舍入是“舍入到偶數”(銀行家的捨入):

返回值
類型:System.Double
最接近 a 的整數。如果 a 的小數部分介於兩個整數之間,其中一個為偶數,另一個為奇數,則返回偶數。請注意,此方法返回 aDouble而不是整數類型。

備註
此方法的行為遵循 IEEE 標準 754 第 4 節。這種舍入有時稱為四捨五入或銀行家四捨五入。它可以最大限度地減少因在單個方向上持續舍入中點值而導致的捨入誤差。

您可以使用帶值的重載Math.Round指定如何舍入中點。有一個重載,對應於每個沒有重載的重載:MidpointRoundingMidpointRounding

這個預設值是否選擇得當是另一回事。(MidpointRounding僅在 .NET 2.0 中引入。在此之前,我不確定是否有任何簡單的方法可以在不自己動手的情況下實現所需的行為。)特別是,歷史表明這不是預期的行為——在大多數情況下,這是API 設計中的一大罪過。我明白為什麼銀行家的四捨五入很有用……但這仍然讓很多人感到驚訝。

您可能有興趣查看最近的 Java 等效枚舉 ( RoundingMode),它提供了更多選項。(它不只是處理中點。)

引用自:https://stackoverflow.com/questions/977796