1. 程式人生 > 實用技巧 >C# 中,使用 Math.Round 方法時,需要注意這不是簡單的四捨五入!

C# 中,使用 Math.Round 方法時,需要注意這不是簡單的四捨五入!

> 為什麼 Math.Round(4.125, 2) 的結果是 4.12 而不是 4.13

在計算機中對浮點數的處理是按 IEEE 754 標準進行的,同時該標準對舍入規則也做了約定。

預設情況下,使用 Math.Round 方法時執行的舍入規則,主要是中值的舍入規則,根據官方文件說明是按 IEEE 754 中,“中值舍入為最接近的偶數”進行處理的。

文件地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.math.round#midpoint-values-and-rounding-conventions

IEEE 754 標準:https://zh.wikipedia.org/wiki/IEEE_754#%E6%B5%AE%E9%BB%9E%E6%95%B8%E7%9A%84%E6%8D%A8%E5%85%A5

> 詳細解釋

至於為什麼預設按此標準執行,找到了網上的一篇解釋,覺得比較清晰,轉載如下:

當有兩個最接近的可表示的值時首選“偶數”值,這與我們常見的“四捨五入”只有一點不同,對.5的舍入上,採用取偶數的方式。
如:

Round(0.5) = 0;
Round(1.5) = 2;
Round(2.5) = 2;

對比採用四捨五入:

Round(0.5) = 1;
Round(1.5) = 2;
Round(2.5) = 3;

之所以IEEE754要這麼做,主要是因為浮點數在計算機中存放的位數有限,其表示精度有限,所以必然有部分浮點數無法精確表示,對於這部分浮點數我們就需要舍入處理。但是對於.
5,它到0和1的距離一樣近,如果我們按照四捨五入的方式舍入,則計算上的誤差會一直疊加,為了平衡誤差,我們需要等概率地取捨。從統計學角度看,二進位制數舍入位的前一位是0或1的概率相等,至於為什麼舍入取偶數而不是奇數,這是個歷史問題。

原文連結:https://blog.csdn.net/qq_20480611/article/details/52564428

> 四捨六入五成雙

然後又找到了百度百科在“四捨五入”的百科中,提到了一種叫“四捨六入五成雙”的方法,這個方法應該跟上面描述的是同一種方法,所以這個不僅僅是在計算機處理浮點數時的規則,在執行任何小數處理時,這都是一種比較科學的處理方法。

百科連結:https://baike.baidu.com/item/%E5%9B%9B%E8%88%8D%E5%85%AD%E5%85%A5%E4%BA%94%E6%88%90%E5%8F%8C