2014-01-25 230 views
2

對於這些代碼行,我返回0作爲輸出,它們都是相等的。現在,如果我理解正確,ab和c可能會存儲稍微不同的真實值.3版本。因此,當針對這些值執行Float.compare(...)時,我希望返回0以外的值作爲輸出。爲什麼我將它們作爲0?浮點運算和浮點值比較

float a = 0.15f + 0.15f; 
float b = 0.1f + 0.2f; 
float c = 0.3f; 
System.out.println(Float.compare(a, b)); //<--- outputs 0 
System.out.println(Float.compare(a, c)); //<--- outputs 0 
System.out.println(Float.compare(b, c)); //<--- outputs 0 
+1

只是因爲浮點不是一般的不夠準確,並不意味着它是不是在特定情況下不夠準確。 –

+2

你可以加上你的問題,對於double值,它不會以這種方式工作(因爲'0.1d + 0.2d'的結果是'0.30000000000000004',所以'-1','0','1'其他數字是'0.3')。 – Pshemo

+0

@Pshemo:「0.1d」和「0.1f」一樣不準確,只是更多的小數位。浮點精度不能表示0.1,它是以2爲底的重複序列。 –

回答

1

因爲,就像你說的,他們可能略有不同的版本。但有了這些簡單的表達式,就不會有精度損失,所以a,b和c都包含完全相同的版本.3f

爲了好玩,試試這個。在這裏,你會失去精度,比較的結果將不會是0

public static void main(String[] args) { 
    float a = .3f; 
    float b = .3f; 
    a = (float) Math.cos(a); 
    a = (float) Math.acos(a); 
    System.out.println(Float.compare(a, b)); 
}