2012-09-30 67 views
0

最後一次迭代所以我有一個簡單的for循環:打印在for循環

double bg = 5.0; 
    double f = 0.0; 
    for(double i = 0; i <= bg; i += 1) 
    { 
     f = f + ((2 * i + 1)*0.1); 

     if(i == bg) 
     { 
      System.out.printf ("%.1f" , f); 
     } 
    } 

當我增加我與各1 itiration它工作正常。 但是,當我做我+ = 0.1它不會打印f。 任何想法爲什麼?

+3

(爲什麼不呢?外循環打印) – Mat

+0

我知道這是另一種方式來做到這一點,但我也試過這個。我想知道爲什麼這不起作用。 我只是好奇,你可以說。 –

回答

5

你不能比較那樣的花車。

通常兩個浮體(雙打)的平等與檢查的東西像

如果(Math.abs(I - BG)< 0.00001f)//0.00001f是很小的值 - 幾乎爲零,挑這個值根據自己的需要

詳細看看http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

你的代碼看起來應該像

double bg = 5.0; 
    double f = 0.0; 
    for(double i = 0; i <= bg; i += 1) 
    { 
     f = f + ((2 * i + 1)*0.1); 

     if (Math.abs(i - bg) < 0.00001f) 
     { 
      System.out.printf ("%.1f" , f); 
     } 
    } 
+0

是的。這就是甚至JUnit使用一些delta來比較兩個浮點數/雙精度的原因:\t'static public assertEquals(double expected,double actual,double delta){(...)}' – dantuch

+1

準確地說。在我所研究的大多數項目中,在項目的某個共同庫中定義了用於比較雙/浮點數相等的方法,並鼓勵所有在項目上工作的人都使用該方法。像CommonMath.isEqual(double a,double b)delta這樣的思考大多數情況下是爲項目預定義的 – Igor

1

浮點麻木對於您認爲可能的所有數字,ers沒有確切的表示。例如,當將1除以3​​時,您得到0.333 ...因爲您使用了十進制數字系統。

但是,計算機使用二進制,所以儘管0.1看起來像是一個簡單而準確的編號,但在二進制文件中它看起來更像0.0001100011 ...,等等無窮大。而且,由於電腦沒有無限的記憶,所以這個數字四捨五入到最接近的表示。這就是爲什麼確切的比較不起作用。

有很多方法可以解決這個問題。一種選擇是使用已經提到的增量比較。但是,如果您知道只會處理小數點後的數字,您可以將所有數字乘以100,而不是使用整數。例如,如果您正在進行貨幣計算,這是建議的方式。

0

在我的圖形化工具,我會遍歷整數值,動態計算的浮動:

int bg = 5; 
double f = 0.0; 
for(int i = 0; i <= bg; i += 1) { 
    f = f + ((2 * i + 1)*0.1); 

    if(i == bg) 
    { 
     System.out.printf ("%.1f" , f); 
    } 
}