2014-03-12 42 views
-1
public void testLoop(double doubleTwo) { 
    double doubleOne = 0; 
    while (true) { 
     if (doubleOne == doubleTwo) 
      break; 
     double difference = doubleTwo - doubleOne; 
     if (difference < 1) 
      doubleOne = doubleOne + difference; 
     else 
      doubleOne = doubleOne + 1.0; 
    } 
} 

我關心雙重比較。但是代碼添加了epsilon差異。那麼循環總是會中斷?這個循環會不會總是斷開 - 雙重比較

+0

但爲什麼不使用http://docs.oracle.com/javase/7/docs/api/java/ lang/Double.html#compare(double,double) –

+0

如果參數是NaN,它不會中斷。你應該使用'Double.compare()'。 – fge

回答

0

其原因是.. 在第一difference將是> 1對於每個doubletwo>1

因此doubleOne的值將在每次迭代中增加1

經過幾次迭代後,doubleOne的值將是>的值,而不是doubleTwo

所以difference<1並在該點 doubleOne + difference將設置的doubleOnedoubleTwo相等的值。 和循環中斷。

doubleTwo小於1時,difference被添加到0,當然這個數字是相等的。

這就是爲什麼循環每次都退出。

0

我在這個循環中看到的問題是使用「double == double」。 由於雙打對於每個定義都是不精確的,因此測試像if (doubleOne - doubleTwo <= 0.00001)這樣的特定增量將會更安全。 我個人比較雙打,看看他們是否真的是相同的方式是

public static boolean equals (final double aObj1, final double aObj2) 
{ 
    return (aObj1 == aObj2) || (Double.doubleToLongBits (aObj1) == Double.doubleToLongBits (aObj2)); 
} 

心連心