2012-11-24 28 views
1

我遇到此代碼的問題! 我想在java中運行代碼,但答案似乎很奇怪。Java數字格式窘境

float a=0.1F; 
float b=0.2F; 
if((a+b)==0.3){ 
System.out.println("True"); 
} 
else{ 
System.out.println("False"); 
} 

答案是:假 但理論上它應該返回True。 如果我們使用a和b的值如0.15和0.15或者0.05和0.25,那麼函數返回True。 我很困惑。 我已經閱讀過Java/JavaScript等語言實現IEEE-754數字格式的地方!如果是這樣,那麼這是什麼格式和代碼有什麼問題?無論如何改變數字格式?

+1

這會有幫助嗎? (a + b)==。3F? –

+0

可能的Dupe http://stackoverflow.com/questions/7289361/double-arithmetic-and-equality-in-java –

+0

謝謝!我之前沒有注意到這個問題。問題在於數字表示的二進制形式。 –

回答

4

漂浮物(a+b)和雙打(0.3)之間的精確差異導致條件爲假。你可以改用(a+b)==0.3F。即

float a = 0.1F; 
float b = 0.2F; 
if ((a + b) == 0.3F) { // notice the "F" 
    System.out.println("True"); 
} else { 
    System.out.println("False"); 
} 
 
True 

編輯:在這種情況下,即使您使用double S中的條件將是false

double a = 0.1; 
double b = 0.2; 
if ((a + b) == 0.3) { 
    System.out.println("True"); 
} else { 
    System.out.println("False"); 
} 
 
False 

印刷0.1 + 0.2將揭示w^HY(數量不能完全表示):

 
0.30000000000000004 
+0

這是行不通的。由於將10個鹼基轉換爲2個鹼基而造成的數據丟失也可能導致條件錯誤。 – ankitjaininfo

+0

O.K.我忘了用0.3提到f。 –

+0

如果所有變量都聲明爲double,該怎麼辦?然後編譯並運行,看到答案是錯誤的! –

1

(a + b)是浮動的,而0.3是double。你應該把它與同類型產品比較:

if ((a + b) == 0.3F) { 
+0

嘗試運行程序,取值爲a = 0.15和b = 0.15,然後檢查輸出! –

1

簡單˚F添加到數字的末尾做出doublefloat之間的編譯器區分:

float a=0.1F; 
float b=0.2F; 
if((a+b)==0.3f){ 
System.out.println("True"); 
} 
else{ 
System.out.println("False"); 
} 

UPDATE:

也看到類似的問題:

其中最好的答案指出,你應該使用檢查高高飛翔ewuality:

if(Math.abs((a+b) - 0.3F) < epsilon) 

其中小量是一個非常小的數字,如0.00000001,根據所需的精度。

+0

忘記f!用聲明爲double的所有變量運行程序! –

+0

@ankurSharma不會工作。作爲.1/.2/.3它們沒有確切的二進制表示。建議不要在float和double上使用==。 –

+0

是啊!這就是IEEE-754號碼錶示方案的問題。它也是JavaScript的問題! 感謝您的時間和幫助! –

0
float a=0.1F; 
float b=0.2F; 
if((a+b)==0.3){ 
System.out.println("True"); 
} 
else{ 
System.out.println("False"); 
} 

.3默認情況下是雙精度型。你確實看到它爲.3,但對於計算機,它的確切值是.2999998 ...。因此有所不同。

如果你明確地告訴編譯器.3是float,那麼你的類比將成立。

所以

float a=0.1F; 
float b=0.2F; 
if((a+b)==0.3F){ 
System.out.println("True"); 
} 
else{ 
System.out.println("False"); 
} 

按照this thread滿足你渴望的 「雙」 的問題

+0

嘗試編譯聲明所有變量爲double而不是float的程序,然後告訴我你是怎麼得到的! –

+0

@ankurSharma我知道那個.1/.2/3不是確切的浮動或雙重。我們在玩一些流行測驗嗎? –

+0

@ankursharma請參考文章中的更新鏈接。 –

1

決不比較浮點/雙精度與==跡象。

即使您在數字後加上'f',這也無法正常工作。這裏的問題不是格式,而是數據丟失。數據丟失是因爲將10個鹼基轉換爲2個鹼基也可能使條件成爲假。