浮點文字
浮點文字提供的值可以在需要 float
或 double
例項的地方使用。浮點字面量有三種。
- 簡單的小數形式
- 縮放的十進位制形式
- 十六進位制形式
(JLS 語法規則將兩個小數形式組合成一個表單。為便於解釋,我們將它們分開處理。)
float
和 double
文字有不同的文字型別,用字尾表示。各種形式使用字母來表達不同的東西。這些字母不區分大小寫。
簡單的小數形式
最簡單形式的浮點文字由一個或多個十進位制數字和一個小數點(.
)和一個可選字尾(f
,F
,d
或 D
)組成。可選字尾允許你指定文字是 float
(f
或 F
)或 double
(d
或 D
)值。預設(當沒有指定字尾時)是 double
。
例如
0.0 // this denotes zero
.0 // this also denotes zero
0. // this also denotes zero
3.14159 // this denotes Pi, accurate to (approximately!) 5 decimal places.
1.0F // a `float` literal
1.0D // a `double` literal. (`double` is the default if no suffix is given)
實際上,後跟字尾的十進位制數字也是浮點字面值。
1F // means the same thing as 1.0F
十進位制文字的含義是 IEEE 浮點數,它最接近由十進位制浮點形式表示的無限精度數學實數。使用 *round 到 nearest,*將此概念值轉換為 IEEE 二進位制浮點表示。 (十進位制轉換的精確語義在 Double.valueOf(String)
和 Float.valueOf(String)
的 javadocs 中指定,請記住數字語法有所不同。)
縮放的十進位制形式
縮放的十進位制形式由簡單的小陣列成,由 E
或 e
引入的指數部分,後跟有符號整數。指數部分是一個簡寫,用於將十進位制形式乘以 10 的冪,如下面的示例所示。還有一個可選的字尾來區分 float
和 double
文字。這裡有些例子:
1.0E1 // this means 1.0 x 10^1 ... or 10.0 (double)
1E-1D // this means 1.0 x 10^(-1) ... or 0.1 (double)
1.0e10f // this means 1.0 x 10^(10) ... or 10000000000.0 (float)
文字的大小受到表示(float
或 double
)的限制。如果比例因子導致值太大或太小,則編譯錯誤。
十六進位制形式
從 Java 6 開始,可以用十六進位制表示浮點文字。十六進位制形式與簡單和縮放的十進位制形式具有類似的語法,但有以下區別:
- 每個十六進位制浮點文字都以零(
0
)開頭,然後是x
或X
。 - 數字的數字(但不是指數部分!)還包括十六進位制數字
a
到f
及其大寫等價物。 - 指數是強制性的,由字母
p
(或P
)代替e
或E
引入。指數表示比例因子,其為 2 的冪而不是 10 的冪。
這裡有些例子:
0x0.0p0f // this is zero expressed in hexadecimal form (`float`)
0xff.0p19 // this is 255.0 x 2^19 (`double`)
建議:由於大多數 Java 程式設計師都不熟悉十六進位制浮點形式,因此建議謹慎使用它們。
下劃線
從 Java 7 開始,在所有三種浮點文字形式的數字字串中都允許使用下劃線。這也適用於指數部分。請參閱使用下劃線以提高可讀性 。
特別案例
如果浮點文字表示太大或太小而無法在所選表示中表示的數字,則編譯錯誤; 即如果數字溢位到+ INF 或 -INF,或下溢到 0.0。但是,文字表示非零非規範化數字是合法的。
浮點文字語法不提供 IEEE 754 特殊值的文字表示,例如 INF 和 NaN 值。如果需要在原始碼中表達它們,推薦的方法是使用 java.lang.Float
和 java.lang.Double
定義的常量; 例如 Float.NaN
,Float.NEGATIVE_INFINITY
和 Float.POSITIVE_INFINITY
。