首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# double 浮點數精度丟失:0.35+0.32≠0.67 根因與 Decimal 解決方案

     編輯:程式設計綜合問答

現象

0.35 + 0.32 = 0.66999999999999993
0.35 + 0.31 = 0.65999999999999992
0.25 + 0.21 = 0.45999999999999996

根本原因:IEEE 754 二進制浮點數

十進制小數如 0.35、0.32 在二進制中多為無限循環小數(如 0.35 = 0.0101100110011...₂),double (64位) 僅能近似存儲,運算時誤差累積。

解決方案:decimal 類型

decimal a = 0.35m, b = 0.32m;
Console.WriteLine(a + b); // 精確輸出 0.67
  • decimal 為 128 位十進制浮點數,專為財務/精確計算設計。
  • 字面量後綴 m 表示 decimal,避免隱式轉型丟失精度。
  • 範圍 ±1.0×10⁻²⁸ 至 ±7.9×10²⁸,精度 28-29 位有效數字。

對比表

類型位數進制適用場景性能
float32二進制圖形、科學計算、可容忍誤差最快
double64二進制通用科學計算、默認實數類型快
decimal128十進制貨幣、稅率、精確業務計算較慢 (軟件模擬)

最佳實踐

  1. 涉及金額、比率、百分比等業務數值,一律使用 decimal。
  2. 資料庫對應 decimal(18,2) / money,ORM 映射為 decimal。
  3. 顯示時用 ToString("F2") 或 String.Format("{0:C}", val) 格式化。
  4. 避免 double 與 decimal 混合運算,需顯式轉型 (decimal)dVal。

參考資源

C# 浮點數精度問題深度解析

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