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

C++ 為什麼不建議用浮點數控制 for 循環?

     編輯:程式設計疑難解答

代碼:

for (double y = 0.1; y != 1.0; y += 0.1)
    cout << y << endl;

現象:循環不會在 1.0 停止,繼續跑到 1.1、1.2…

根本原因:浮點數誤差

  • 0.1 在二進制無法精確表示(類似 1/3 在十進制是 0.333…)。
  • 累加 10 次後,y 實際約為 0.9999999999999999 或 1.0000000000000001,永遠不等於 1.0。
  • 條件 y != 1.0 恆真,循環無限執行。

正確寫法

  1. 用整數計數:
    for (int i = 1; i <= 10; ++i) {
        double y = i * 0.1;
        cout << y << endl;
    }
    
  2. 若必須用浮點數判斷,設容差:
    const double EPS = 1e-9;
    for (double y = 0.1; y < 1.0 + EPS; y += 0.1) { ... }
    

最佳實踐

  • 循環控制變量**優先用整數**。
  • 浮點數比較**永遠不用 == / !=**,用 fabs(a-b) < EPS。
  • 涉及金額、精確計算用 BigDecimal (Java) 或定點數/整數分/厘。

理解 IEEE 754 浮點數表示誤差,是寫出健壯數值代碼的前提。

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