首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# Math.Round 實現銀行家圍入法(四捨六入五成雙)

     編輯:關於C語言

C# Math.Round 實現銀行家圍入法(四捨六入五成雙)

背景:為什麼需要「奇進偶不進」

傳統「四捨五入」在大量數據累加時,會導致結果系統性偏大(因 5 總是進位)。統計學證明,「銀行家圍入法」(Banker's Rounding,即 **四捨六入五成雙**,中文常稱「奇進偶不進」)能使圍入誤差均值趨近零,避免誤差累積,是金融、科學計算的標準圍入規則。

規則詳解

  • 捨入位 < 5:捨去(如 5.214 → 5.21)。
  • 捨入位 > 5:進位(如 5.216 → 5.22)。
  • 捨入位 = 5:看捨入位前一位(末位數字):
    • 前一位為**奇數** → 進位(如 5.215 → 5.22,前一位 1 為奇)。
    • 前一位為**偶數** → 不進位(如 5.225 → 5.22,前一位 2 為偶)。

C# 實現:MidpointRounding.ToEven

double d = 5.215;
double res = Math.Round(d, 2, MidpointRounding.ToEven);
Console.WriteLine(res); // 5.22

d = 5.225;
res = Math.Round(d, 2, MidpointRounding.ToEven);
Console.WriteLine(res); // 5.22

完整測試用例

// 4
double d = 5.214;
Console.WriteLine(Math.Round(d, 2, MidpointRounding.ToEven)); // 5.21

// 6
d = 5.216;
Console.WriteLine(Math.Round(d, 2, MidpointRounding.ToEven)); // 5.22

// 5 - 奇進
d = 5.215;
Console.WriteLine(Math.Round(d, 2, MidpointRounding.ToEven)); // 5.22

// 5 - 偶不進
d = 5.225;
Console.WriteLine(Math.Round(d, 2, MidpointRounding.ToEven)); // 5.22

// 更多小數位
d = 0.7865666;
Console.WriteLine(Math.Round(d, 2, MidpointRounding.ToEven)); // 0.79
d = 0.786;
Console.WriteLine(Math.Round(d, 2, MidpointRounding.ToEven)); // 0.79
d = 0.785;
Console.WriteLine(Math.Round(d, 2, MidpointRounding.ToEven)); // 0.78

對比:MidpointRounding.AwayFromZero(傳統四捨五入)

Math.Round(5.225, 2, MidpointRounding.AwayFromZero); // 5.23(總是進位)
Math.Round(5.215, 2, MidpointRounding.AwayFromZero); // 5.22

應用場景

  • 金融計算(利息、匯率、稅費):避免長期運行產生系統性誤差。
  • 科學數據處理:統計均值、測量數據圍入。
  • Excel/CSV 數據導入導出:保持與 Excel 默認圍入行為一致(Excel 使用銀行家圍入法)。

總結

C# 通過 Math.Round(value, digits, MidpointRounding.ToEven) 直接支持銀行家圍入法,無需手動實現。正確選擇圍入模式對數據準確性至關重要,**金融、統計場景請優先使用 ToEven**,除非業務明確要求傳統四捨五入。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved