在 Java 中表示浮点值

IT小君   2021-11-15T00:34:02

看下面的三行代码。

  float f = 1;

  float g = 1.1;

  float h = 1.1f;

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

评论(4)
IT小君

Java 中的浮点文字double默认是一个值。

JLS 3.10.2 浮点文字

如果浮点文字float以 ASCII 字母F为后缀,则它属于类型f否则它的类型是double并且可以选择后缀为 ASCII 字母Dd.

您不能doublefloat没有显式收缩转换情况下为 a赋值因此,您有两个选择:

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

后者的一个例子是:

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

关于扩大转化

编译的原因:

float f = 1;

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

JLS 5.2 作业转换

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

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

JLS 5.1.2 扩大原语转换

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

  • intlong, float, 或double
  • [...]

文字的其他数据类型后缀

如上所述,还有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)"

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

JLS 3.10.1 整数文字

long如果以 ASCII 字母Ll( ell)为后缀,则为整数文字类型否则它是类型int最好使用后缀L,因为字母l( ell) 通常很难与数字1( one)区分开来

2021-11-15T00:34:02   回复
IT小君

您正在doublefloat变量赋值。 编译器假定1.1其本身(没有f附加在最后)是 类型double编译器不喜欢进行隐式向下转换,因为那里可能会失去精度。

2021-11-15T00:34:02   回复
IT小君

第一行自动转换intfloat(ok)。

由于精度损失,第二行无法投射doublefloat您可以进行显式转换:

float g = (float) 1.1;

第三行不需要修改。

2021-11-15T00:34:03   回复
IT小君

在 Java 中,每个浮点数(任何带小数点的数字)都默认为 a double,这比 a 更精确float默认情况下,由于精度损失,Java 不允许您将 a 转换double为 a float

您仍然可以分配doublefloat通过浇注:

float g = (float) 1.1;
2021-11-15T00:34:03   回复