浮点文字

浮点文字提供的值可以在需要 floatdouble 实例的地方使用。浮点字面量有三种。

  • 简单的小数形式
  • 缩放的十进制形式
  • 十六进制形式

(JLS 语法规则将两个小数形式组合成一个表单。为便于解释,我们将它们分开处理。)

floatdouble 文字有不同的文字类型,用后缀表示。各种形式使用字母来表达不同的东西。这些字母不区分大小写。

简单的小数形式

最简单形式的浮点文字由一个或多个十进制数字和一个小数点(.)和一个可选后缀(fFdD)组成。可选后缀允许你指定文字是 floatfF)或 doubledD)值。默认(当没有指定后缀时)是 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 中指定,请记住数字语法有所不同。)

缩放的十进制形式

缩放的十进制形式由简单的小数组成,由 Ee 引入的指数部分,后跟有符号整数。指数部分是一个简写,用于将十进制形式乘以 10 的幂,如下面的示例所示。还有一个可选的后缀来区分 floatdouble 文字。这里有些例子:

 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)

文字的大小受到表示(floatdouble)的限制。如果比例因子导致值太大或太小,则编译错误。

十六进制形式

从 Java 6 开始,可以用十六进制表示浮点文字。十六进制形式与简单和缩放的十进制形式具有类似的语法,但有以下区别:

  1. 每个十六进制浮点文字都以零(0)开头,然后是 xX
  2. 数字的数字(但不是指数部分!)还包括十六进制数字 af 及其大写等价物。
  3. 指数是强制性的,由字母 p(或 P)代替 eE 引入。指数表示比例因子,其为 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.Floatjava.lang.Double 定义的常量; 例如 Float.NaNFloat.NEGATIVE_INFINITYFloat.POSITIVE_INFINITY