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

C# Math.Round 銀行家捨入法詳解與替代方案

     編輯:關於C語言

`Math.Round` 預設採用 **銀行家捨入法** (Banker's Rounding / Round to Even):
Math.Round(2.5) = 2、Math.Round(3.5) = 4。
即「四捨六入五成雙」,減少大量資料統計偏差,符合 IEEE 754 標準。

為什麼不是傳統四捨五入?

傳統「五入」會使大量資料的平均值向上漂移。銀行家捨入讓 .5 向最近的 **偶數** 靠攏,正負抵消,長期統計更公平。金融、科學計算常要求此模式。

常見需求:強制四捨五入 (五入)

方案一:MidpointRounding.AwayFromZero (.NET Core 2.0+ / .NET Framework 4.5+)


Math.Round(2.5, MidpointRounding.AwayFromZero) // 3
Math.Round(3.5, MidpointRounding.AwayFromZero) // 4
Math.Round(-2.5, MidpointRounding.AwayFromZero) // -3

方案二:手動公式 (相容舊版)


double RoundHalfUp(double value, int decimals)
{
    double factor = Math.Pow(10, decimals);
    return Math.Floor(value * factor + 0.5) / factor;
}
// 或
decimal d = 2.5m;
decimal rounded = Math.Floor(d * 10 + 0.5m) / 10; // 3.0

方案三:字串格式化 (僅顯示用)


value.ToString("F0") // "3" (四捨五入顯示)
value.ToString("N2") // "2.50" (保留兩位)
string.Format("{0:N2}", value)

Decimal vs Double 精度陷阱


double d = 0.1 + 0.2; // 0.30000000000000004
decimal m = 0.1m + 0.2m; // 0.3
// 金融/會計務必用 decimal
decimal.Round(2.5m, MidpointRounding.AwayFromZero) // 3

總結選擇表

需求推薦方法
統計/科學計算、符合 IEEE 754`Math.Round` (預設 Banker's)
金融/會計/一般商業四捨五入`Math.Round(value, MidpointRounding.AwayFromZero)` + `decimal` 型別
純顯示格式化`ToString("F/N")` / `string.Format`
舊版 Framework 無 MidpointRounding手動 `Floor(x*10^n + 0.5)/10^n`

理解捨入模式差異,選對型別與方法,避免「明明 2.5 卻變 2」的生產事故。

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