2010-05-29 32 views
5

浮點數誰能請我爲什麼以下程序的輸出不是「不同的不同」?在Java中

public static void main(String[] args) 
{ 

float f1=3.2f; 
float f2=6.5f; 

if(f1==3.2) 
System.out.println("same"); 
else 
System.out.println("different"); 

if(f2==6.5) 
System.out.println("same"); 
else 
System.out.println("different"); 
} 

O/P:不同 相同

+0

這是爲什麼呢? – 2010-05-29 18:55:22

回答

11

6.5具有有限的二進制表示:110.1

任何浮動型與至少4顯著位可以完美表示此號碼。

110.100000000000000000000(浮點)
= 6.5

110.10000000000000000000000000000000000000000000000000(雙)
= 6.5

3.2,另一方面具有無限的二進制表示:101.0011001100110011 ...

浮點和雙精度不具有無限的精度,因此只能近似這個號碼:(

101.001100110011001100110(浮動)
= 3.2000000476837158203125

101.00110011001100110011001100110011001100110011001101(雙)
= 3.20000000000000017763568394002504646778106689453125

正如你可以清楚地看到,這些數字是不一樣的!

+0

+1給你,因爲這是唯一的答案,實際上回答問題。我不知道爲什麼OP接受了另一個答案,這個答案絕對不能解釋爲什麼一個測試給出*「相同」*和另一個*「不同」*。 – NoozNooz42 2010-05-29 22:47:40

+2

我只想補充一點,另一個原因是Java將不太精確的類型提供給更精確的類型進行比較,這使得3.2和3.2f的比較成爲可能。如果它在這裏縮短了較長的類型,這些將會是相同的,但是幸好它(如C)使用*擴大原始轉換*來完成大多數人可能期望的操作:http://bit.ly/d8Yx3N – tgamblin 2010-05-29 22:54:02

+0

@ NoozNooz42:嘿,我得到了正確的答案(: – 2010-05-29 23:12:06

1
This

可以幫助理解

3

由於3.2F是float值和3.2double值。浮點數總是稍微不準確,因爲二進制表示不能準確地實現它們,所以將它們進行比較是一個不錯的主意。 特別比較花車與雙打。諸如3.2f == 3.2f之類的表達通常是可以的,但即使這些表達也可能在某些語言中失敗,例如,如果它們比內存中更準確地表示寄存器中的數字。

+0

+1,因爲這個解釋比我寫的更徹底。 :) – edl 2010-05-29 18:59:37

+0

我認爲這個問題是爲什麼他們中的一個比較相等。 OP期望他們都不平等。 – 2010-05-29 19:19:43

+3

「浮點數字*總是*稍微不準確」 - >錯誤。 float和double可以表示像6.5這樣的有限二進制表示的分數。詳情請參閱我的回答。 – fredoverflow 2010-05-29 22:41:31

0

「3.2F」 是一種類型的漂浮物。 「3.2」是雙重類型。

0

另外,我覺得有一個小數默認任何東西到了一倍,所以當你做一個比較,你必須添加「F」以及類似if(f2==6.4f)

5

由於3.2不能完全表示爲浮點數,6.5是(提示:6.5 = 13 * 2 ^( - 1)),以及3.2是文字的double,但3.2f的文字是float