程式碼交換兩個 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) 格式化輸出至小數點後兩位,隱藏誤差。 |
浮點數誤差是硬體標準決定的特性,不是程式錯誤。選對資料類型與輸出格式,才能避免業務邏輯錯誤。