在Java中表示浮点值

Abh*_*ain 9 java floating-point

看下面的三行代码.

  float f = 1;

  float g = 1.1;

  float h = 1.1f;
Run Code Online (Sandbox Code Playgroud)

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

pol*_*nts 22

double默认情况下,Java中的浮点文字是一个值.

JLS 3.10.2浮点文字

浮点字面值的类型float如果后缀为ASCII字母Ff; 否则它的类型是double,它可以选择后缀ASCII字母Dd.

如果没有明确的缩小转换,则无法double为a 赋值float.因此,您有两种选择:

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

后者的一个例子是:

double d = 1.1;
float f = (float) d; // compiles fine!
Run Code Online (Sandbox Code Playgroud)

在扩大转换

这个编译的原因是:

float f = 1;
Run Code Online (Sandbox Code Playgroud)

是因为从扩大转换intfloat可以在转让的情况下隐式进行.

JLS 5.2分配转换

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

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

JLS 5.1.2扩展原始转换

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

  • intlong,floatdouble
  • [...]

文字的其他数据类型后缀

如上所述,还有Dd后缀double.请考虑以下代码段:

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)"
Run Code Online (Sandbox Code Playgroud)

long文字的后缀也是L或者l(小写字母).这是强烈建议您使用大写字母变体.

JLS 3.10.1整数文字

如果整数文字long后缀为ASCII字母Ll(ell),则为整数文字; 否则它是类型int.后缀L是首选,因为letter l(ell)通常很难与digit 1(one)区分开来.


Bil*_*ard 7

您正在doublefloat变量赋值. 编译器假定1.1它本身(没有在f末尾添加)double.编译器不喜欢进行隐式向下转换,因为有可能失去精度.

  • (更明确一点 - 默认情况下,Java中的浮点常量是`double`,除非它们在末尾包含`f`,这使它们成为`float`.) (4认同)