2017-05-31 119 views
2

我有一個關於我的代碼的問題。我知道我需要在代碼中改變什麼,但是我想明白爲什麼會發生這種情況,因爲我真的想學習基礎知識。所以我的代碼是:while while循環中兩個條件之間的區別

public class chunnimunni { 
    public static void main(String[] args) { 
     double number = 2.0; 
     while (true) { 
      if (number == 0.5) 
       break; 
      number -= 0.1; 
      System.out.printf("%8.1f", number); 
     } 
     System.out.println ("Finished."); 
    } 
} 

這段代碼將繼續並無限期地打印出數字,它不會停在0.5。但是,如果我從改變而條件:

while (true) 

while (number > 0.5) 

然後它工作。

如果有人能解釋這個原因,我會非常高興。謝謝。

+1

而不是'System.out.printf(「%8.1f」,number);''使用'System.out.println(number);'你會看到更精確的值被'號碼'0.49999999999999933'不等於'0.5'所以'if(number == 0.5)break;'永遠不會發生。更多在此[在浮點數學是否壞了?](https://stackoverflow.com/questions/588004/is-floating-point-math-broken) – Pshemo

回答

6

浮點數缺少精度,因此做比較如if (number == 0.5)通常不會按預期工作。我想你想要if (number <= 0.5) break

如果你真的想在浮點數上做平等,那麼你應該有所作爲,並與小數進行比較。例如,

if (Math.abs(number - 0.5) < 1E-9) 
+0

是的,我知道這一點。這就是爲什麼我有printf條件,所以它只打印出一位小數。這不是問題,但問題是關於while循環中的真實語句。 – mackanmorre

+0

然後你不知道這一點,因爲相同的規則適用於你的情況。 – sturcotte06

+2

@mackanmorre:printf不重要;你還在比較浮點值。除非你將它與某種epsilon值進行比較(也就是說,減去該值並將其與預期的小數位數相比較),否則您可能會永久停留在一個循環中,其值不是*完全相同* 0.5。 – Makoto