`Math.Round` 預設採用 **銀行家捨入法** (Banker's Rounding / Round to Even):
Math.Round(2.5) = 2、Math.Round(3.5) = 4。
即「四捨六入五成雙」,減少大量資料統計偏差,符合 IEEE 754 標準。
傳統「五入」會使大量資料的平均值向上漂移。銀行家捨入讓 .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)
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」的生產事故。