浮点文字
浮点文字提供的值可以在需要 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
。