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

C 浮點數交換誤差:IEEE 754 表示限制非 Bug

     編輯:程式設計綜合問答

程式碼交換兩個 float 變數,輸出結果出現 66.400002、559.400024 而非精確的 66.4、559.4。

原因

  • float (單精度,32 位) 依 IEEE 754 標準,**無法精確表示大多數十進位小數**。
  • 66.4 二進位為無限循環小數,存入 float 時發生捨入,讀出時顯示近似值。

驗證

float a = 559.4f, b = 66.4f;
printf("a=%.10f, b=%.10f\n", a, b);
// 輸出:a=559.4000244141, b=66.4000015259

解決方案

場景建議
一般科學計算改用 double (雙精度,53 位有效位),誤差大幅降低。
貨幣/金融精確計算用整數存「分」(乘 100) 或 BigDecimal (Java) / decimal (C#) / 定點數庫。
單純顯示printf("%.2f", val) 格式化輸出至小數點後兩位,隱藏誤差。

核心認知

浮點數誤差是硬體標準決定的特性,不是程式錯誤。選對資料類型與輸出格式,才能避免業務邏輯錯誤。

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