2012-12-04 20 views
11

我只是想要一些關於這方面的信息。爲什麼在浮點號末尾使用字母f?

float n = 2.99944323200023f 

什麼是f在字面的結束呢?這叫什麼?爲什麼使用?

+1

「F」表示它所附加的文字數值是一個浮點值。這是編譯器的必要信息,如果不存在則可能導致錯誤,或者編譯器不正確地解釋編號。 – ScoPi

+0

@ScoPi我在一個程序中試過了它,它將它舍入到5個小數位。據我所知,一個浮點數不是。具有10^-38至10^38的範圍。 – crvineeth99

+2

@ crvineeth99該範圍內的少量不同值可以用浮點數表示。從理論上講,在浮動中存在約43億個不同值的空間,但範圍「10^-38到10^38」具有無窮大的不同值。 – Esailija

回答

13

f表示這是一個浮點型文字,而不是雙重文字(它會隱含地以其他方式)。它沒有我知道的特定技術名稱 - 我傾向於將其稱爲「字母后綴」如果我需要特別提及它,雖然這有點武斷!

例如:

float f = 3.14f; //Compiles 
float f = 3.14; //Doesn't compile, because you're trying to put a double literal in a float without a cast. 

你當然可以這樣做:

float f = (float)3.14; 

......這樣達成足夠靠近同樣的事情,但F是表示一個整潔,更簡潔的方式它。

爲什麼雙重選擇作爲默認而不是浮動?那麼,現在雙精度浮點數的內存需求在99%的情況下並不是問題,它們提供的額外精度在很多情況下都是有益的,因此您可能會認爲這是合理的默認值。

請注意,您可以明確地顯示出十進制文本作爲雙放一個d末也:

double d = 3.14d; 

...但因爲它是一個雙精度值,無論如何,這沒有任何影響。有些人可能認爲它主張它更清楚你的字面意思是什麼,但是我個人認爲它只是混淆了代碼(除非你可能有很多浮點文字掛在旁邊,你想強調這個文字確實是一個雙精度,而f的省略不僅僅是一個bug。)

+0

」完成了近乎相同的事情「我特別感興趣,如果」近「。這不完全是一回事嗎? – leonbloy

+0

@leonbloy那麼,在實踐中它是完全一樣的東西 - 有一個有點理論上的區別,通過做沒有f的演員,你基本上提供了一個雙重字面值,然後將準確度斬波爲浮點值,而不僅僅是提供浮動文字開始。但是,功能明智的是它是相同的。 – berry120

+0

這會產生什麼性能影響 - 或者編譯器是否應該處理這些事情? – Chris

4

Java將爲float變量使用的默認Java類型將是double。因此,即使將任何變量聲明爲float,編譯器必須實際做的也是將一個double值賦值給一個float變量,這是不可能的。因此,要告訴編譯器將此值作爲浮點數處理,那'f'用來。

+0

「因此,即使您將任何變量聲明爲float,分配給它的內存也將與double相同,而不是float。」什麼?!如果你聲明一個浮點數,那麼你不能在沒有轉換的情況下放入一個雙精度浮點數 - 因此將其值降低到32位而不是64. – berry120

+0

但是,如果直接嘗試將這樣的值賦給浮點變量而不使用' f',它會給出一個編譯器錯誤'類型不匹配:不能從雙精度轉換爲浮點數',這意味着它將它視爲雙精度,這肯定會消耗64位。 –

+0

編譯器錯誤是由於這種 - 類型不匹配而不是內存不匹配而產生的。 – berry120

1

這是區分浮點數和雙精度數。後者沒有後綴。

+0

是的,他們有:'雙'litterals後綴是'd'和'D'。但是你可以省略它們。 –

1

當您編寫1.0時,您是否打算將文字作爲浮點數還是雙精度浮點模糊不清。通過編寫1.0f,你告訴Java你打算將文字作爲一個浮點數,而使用1.0d指定它應該是一個double(如果你沒有明確指定,這也是默認值)。

+0

downvote?真?令人印象深刻的...... –

+0

不是我的失望,但是「這是不明確的,你是否打算字面是一個浮點數還是雙精度」是錯誤的 - 在JLS中它表示默認情況下它是雙倍的,所以在那裏沒有任何含糊。 – berry120

+0

正確。 「我的答案更新了 –

1

您需要將'f'放在末尾,否則Java會假設其爲double。

1

如果f最終沒有被精簡,則該值被認爲是double。 和double導致內存中的字節數多於float

2

在Java中,當您鍵入十進制數字作爲3.6時,其解釋爲doubledouble是一個64位精度IEEE 754浮點,而float是一個32位精度IEEE 754浮點。由於float不如double精確,轉換不能隱式執行。

如果您想創建一個浮點數,您應該以f(即:3.6f)結束您的數字。請參閱primitive data types definition of the Java tutorial

相關問題