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

C# 保留小數位數完整指南:Round、Format、ToString 多種方法比較

     編輯:關於C#

C# 中格式化數值保留小數位數的方法眾多,行為細節 (四捨五入模式、尾數處理、文化特性) 差異較大。本文整理 6 種主流方法、百分比格式化、常見陷阱與最佳實務建議。

核心方法速查表

方法範例結果四捨五入模式回傳型別
Math.RoundMath.Round(0.55555, 2)0.56Banker's Rounding (到最近偶數)double/decimal
decimal.Rounddecimal.Round(0.55555m, 2)0.56Banker's Roundingdecimal
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"四捨五入 + 強制顯示尾數 0string

關鍵差異深度解析

1. 四捨五入模式:Banker's Rounding vs AwayFromZero


// 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 避免爭議。

2. decimal vs double 精度陷阱


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。

3. 文化特性 (CultureInfo) 影響


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);

最佳實務建議

  1. 內部計算:全程使用 decimal,僅在最後顯示時格式化。
  2. 顯示格式化:優先使用 ToString("F2") / ToString("N2") / String.Format("{0:F2}", val),行為直覺 (AwayFromZero)。
  3. 需保留尾數 0:使用 "F2"、"N2" 或 "#0.00"。
  4. 金融四捨五入:decimal.Round(val, 2, MidpointRounding.AwayFromZero)。
  5. 跨文化顯示:UI 使用者文化,API/儲存用 InvariantCulture。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved