C# 中格式化數值保留小數位數的方法眾多,行為細節 (四捨五入模式、尾數處理、文化特性) 差異較大。本文整理 6 種主流方法、百分比格式化、常見陷阱與最佳實務建議。
| 方法 | 範例 | 結果 | 四捨五入模式 | 回傳型別 |
|---|---|---|---|---|
Math.Round | Math.Round(0.55555, 2) | 0.56 | Banker's Rounding (到最近偶數) | double/decimal |
decimal.Round | decimal.Round(0.55555m, 2) | 0.56 | Banker's Rounding | decimal |
ToString("F2") | 0.55555.ToString("F2") | "0.56" | 四捨五入 (AwayFromZero) | string |
ToString("N2") | 1234.5.ToString("N2") | "1,234.50" | 四捨五入 + 千分位 | string |
String.Format("{0:F2}", val) | String.Format("{0:F2}", 0.55555) | "0.56" | 四捨五入 | string |
val.ToString("#0.00") | 0.5.ToString("#0.00") | "0.50" | 四捨五入 + 強制顯示尾數 0 | string |
// Banker's Rounding (Math.Round, decimal.Round 預設)
Math.Round(2.5) // 2 (最近偶數)
Math.Round(3.5) // 4
// AwayFromZero (ToString, Format, String.Format)
2.5.ToString("F0") // "3"
3.5.ToString("F0") // "4"
// 指定模式 (Math.Round 多載)
Math.Round(2.5, MidpointRounding.AwayFromZero) // 3
Math.Round(2.5, MidpointRounding.ToEven) // 2 (預設)
金融/會計系統建議明確指定 MidpointRounding.AwayFromZero 避免爭議。
double d = 0.55555;
decimal m = 0.55555m;
Math.Round(d, 2) // 0.56 (double 內部為 0.55554999... 可能產生誤差)
decimal.Round(m, 2) // 0.56 (精確)
金額計算務必使用 decimal,禁止使用 double/float。
var val = 1234.56;
val.ToString("N2", CultureInfo.InvariantCulture) // "1,234.56"
val.ToString("N2", new CultureInfo("de-DE")) // "1.234,56" (德文逗號/點號互換)
序列化/儲存/傳輸時請固定使用 CultureInfo.InvariantCulture。
double rate = 0.1234; // 12.34%
// 方法 1: "P" 格式 (自動乘 100 加 %)
rate.ToString("P2", CultureInfo.InvariantCulture) // "12.34 %"
// 方法 2: 手動乘 100 + 自訂格式
(rate * 100).ToString("#0.00") + "%" // "12.34%"
// 方法 3: NumberFormatInfo 精確控制
var nfi = new NumberFormatInfo { PercentDecimalDigits = 2, PercentSymbol = "%" };
rate.ToString("P", nfi);
decimal,僅在最後顯示時格式化。ToString("F2") / ToString("N2") / String.Format("{0:F2}", val),行為直覺 (AwayFromZero)。"F2"、"N2" 或 "#0.00"。decimal.Round(val, 2, MidpointRounding.AwayFromZero)。