2013-10-13 92 views
0

當我運行此代碼時,爲什麼不顯示「good」這個詞?存儲在Array1和Array2的位置0的值對於兩者都是1。爲什麼不顯示「good」這個詞?

public class ArrayStuff { 

    public static void main(String[] args) { 

     double value = 1; 

     Double[] Array1 = new Double[10]; 
     Array1 = new Double[] {1.0}; 

     Double[] Array2 = new Double[10]; 

     Array2[0] = value; 

     int i = 0; 

     System.out.println(Array1[0]); 
     System.out.println(Array2[i]); 

     if (Array1[0] == Array2[i]) 
     { 

      System.out.println("good"); 

     } 
    } 

} 

回答

3

您正在瞭解計算機無法以精確的精度表示浮點數。解決方案是使用代碼來找到「足夠接近」的浮點解決方案,否則使用十進制數字的解決方案。

+0

1和1.0應該用相同的方式表示。 –

+0

感謝您的快速回復。我正在讀一些關於「問題」的信息......很奇怪。我會把所有東西都改爲int。 – jfred

1

由於有限精度數有它們的limits,特別是在比較它們的精確相等方面。

你應該檢查處理這個問題,如果將值之間的差值小於一定的閾值:

public final double EPSILON = 0.001; 

if (Math.abs(Array1[0] - Array2[i]) < EPSILON) 
... 
5

在Java中,當有人問

Double d1 = ...; 
Double d2 = ...; 
if (d1 == d2) { 
    System.out.println("Equal"); 
} else { 
    System.out.println("Not Equal"); 
} 

的JRE不拆箱Double對象,因此它檢查兩個Double是否是相同的確切對象。在這裏,他們不是。注意的代碼這兩個塊之間的差異:

Integer i1 = new Integer(1); 
Integer i2 = new Integer(1); 
if (i1 == i2) { 
    System.out.println("Equal"); 
} else { 
    System.out.println("Not Equal"); 
} 

Integer i1 = Integer.valueOf(1); 
Integer i2 = Integer.valueOf(1); 
if (i1 == i2) { 
    System.out.println("Equal"); 
} else { 
    System.out.println("Not Equal"); 
} 

第二個版本重用Integer對象,所以在第一印刷不等於和第二打印平等

+0

這裏的兄弟正在......東西:O +1 –

+0

謝謝埃裏克,我確實看到了代碼塊之間的區別,但我認爲這需要更多的研究才能真正理解這個問題。 – jfred

+0

查找Integer.valueOf的Javadoc。它保留了它創建的Integer對象的緩存。 –

0

你的第一個變量是雙重的嗎?我的意思是用一個int來解決這個問題。

這提出了一個問題:這一行實際上是否創建了具有10個插槽的陣列並將第一個值:1.0分配給數組中的0插槽,或者未能正確創建陣列?

Double[] Array1 = new Double[10]; 
    Array1 = new Double[] {1.0}; 

如果沒有,那麼這就是爲什麼,下面的代碼不適合你。沒有向你展示「好」字。

if (Array1[0] == Array2[i]) 
    { 

     System.out.println("good"); 

    } 

... 但是,也許如果改爲1.0作爲第一變量值...但它的不一樣,比較雙打..其不推薦使用。

Double Value = 1.0;