2012-12-31 77 views
30

爲什麼你需要在浮點數字中指定一個後綴fJava:爲什麼你需要在浮點數字中指定'f'?

+3

因爲不然,它不會是_float_文字。 – SLaks

+1

儘管它適用於C,但您可能會喜歡此浮點常量微妙測驗。我相信這五個問題中的每一個都可以在Java中完全相同。 http://blog.frama-c.com/index.php?post/2011/11/08/Floating-point-quiz –

+0

[爲什麼f放在浮動值之後?](http:// stackoverflow。 com/questions/9748160/why-f-is-after-float-values) –

回答

39

因爲否則它默認爲double,這是比float更常用的浮點類型。

Java Language Specification, section 3.10.2

甲浮點文字的類型爲float如果它與ASCII字母F或f爲後綴;否則它的類型是雙精度型的,它可以選擇性地加上ASCII字母D或d(§4.2.3)。

(我個人寧願有沒有默認,使它在所有情況下都清楚,但是這是一個不同的問題。)

+1

但是爲什麼然後有一個類型的減速如果它默認爲一個不同的類型?我知道double只是一個64位浮點數,但是這樣做有一些更深入的理由嗎? – stackoverflow

+1

@stackoverflow:你是什麼意思? * literal *的類型與您使用的變量的類型有些獨立。例如,您可以使用「float」文字並將其分配給「double」變量。在大多數情況下,表達式的類型與使用它的上下文無關。 (有些情況下,泛型的類型被推斷出來,但這是一個特例。) –

+1

@stackoverflow Java支持[縮小轉換](http://docs.oracle.com/javase/specs/jls/se7/html/jls- 5.html#jls-5.2)在將文字分配給基元時。這就是爲什麼你可以'float f = 1.0';儘管'1.0'是一個double。我想這是支持的,因爲它是明確的 - 例如與使用方法調用使用文字不同。 – McDowell

28

由於無後綴浮點文字是雙打,並圓整裝置,即使小的文字可以採取不同的值時,四捨五入浮法和雙。這可以在下面的例子中可以觀察到:

float f = (float) 0.67; 
if(f == 0.67) 
    System.out.print("yes"); 
else 
    System.out.print("no"); 

這將輸出no,因爲四捨五入到浮動四捨五入到兩倍時比它時0.67具有不同的值。另一方面:

float f = (float) 0.67; 
if(f == 0.67f) 
    System.out.print("yes"); 
else 
    System.out.print("no"); 

…輸出yes

EDIT
第二個例子:

if(0.67 == 0.67f) 
    System.out.print("Equal"); 
else 
    System.out.print("Not Equal"); 
4

有跡象表明,可以表示爲例如兩個浮點類型100.0。只有一個可能是默認值。由於其精度有限,浮球是一種非常特殊的類型。正常情況是雙倍的,所以它是合適的默認值。

在現代處理器上,float和double具有相似的計算性能。使用浮點數的唯一情況是在需要有限精度的性能危急情況下的大數組。使用float將適合一個緩存行的浮點值的數量加倍。即便如此,確定float是否爲給定的計算提供了足夠的精度並不是微不足道的。

+0

感謝您的回覆 – stackoverflow

相關問題