在Java中表示浮点值

看下面的三行代码。

float f = 1; float g = 1.1; float h = 1.1f; 

第二行有编译错误,而其他行没有编译错误。 第一行工作正常,没有后缀f,第三行使用后缀f。 为什么是这样?

Java中的浮点文字默认为double值。

JLS 3.10.2浮点文字

如果浮点文字后缀为ASCII字母Ff ,则浮点文字的类型为float ; 否则其类型为double ,并且可以选择以ASCII字母Dd为后缀。

如果没有明确的缩小转换,则不能将double值赋给float 。 因此,您有两种选择:

  • 对于文字,使用后缀fF表示float
  • 对于非文字,使用显式强制转换(float)

后者的一个例子是:

 double d = 1.1; float f = (float) d; // compiles fine! 

在扩大转换

这个编译的原因是:

 float f = 1; 

是因为从intfloat的扩展转换可以在赋值的上下文中隐式完成。

JLS 5.2分配转换

将表达式的值赋给变量时会发生赋值转换 :必须将表达式的类型转换为变量的类型。 赋值上下文允许使用以下之一:

  • 扩展的原始转换(第5.1.2节)
  • […]

JLS 5.1.2扩展原始转换

以下19种关于基本类型的特定转换称为扩展基元转换

  • intlongfloatdouble
  • […]

文字的其他数据类型后缀

如上所述,还有doubleDd后缀。 请考虑以下代码段:

 static void f(int i) { System.out.println("(int)"); } static void f(double d) { System.out.println("(double)"); } //... f(1); // prints "(int)" f(1D); // prints "(double)" 

还有一个long文字的后缀,即Ll (小写字母)。 强烈建议您使用大写变体。

JLS 3.10.1整数文字

如果整数文字后缀为ASCII字母Llell ),则整数文字的长度为long ; 否则它是int类型。 后缀L是优选的,因为字母lell )通常难以与数字1one )区分开。

您正在为float变量赋值。 1.1编译器假设它本身(没有f结尾)是double类型。 编译器不喜欢进行隐式向下转换,因为有可能失去精度。

第一行autocasts int为float(ok)。

由于精度损失,第二行无法转换为浮动。 你必须施放:

 float g = (float) 1.1; 

第三行不需要转换。

在Java中,每个浮点数(任何带小数点的数字)默认为double ,这比float更精确。 默认情况下,Java不允许您将double转换为float因为精度会降低。

您仍然可以通过强制转换为float赋值:

 float g = (float) 1.1;