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字母F或f; 否则它的类型是double,它可以选择后缀ASCII字母D或d.
如果没有明确的缩小转换,则无法double为a 赋值float.因此,您有两种选择:
f或F表示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)
是因为从扩大转换int到float可以在转让的情况下隐式进行.
JLS 5.2分配转换
将表达式的值赋给变量时会发生赋值转换:必须将表达式的类型转换为变量的类型.赋值上下文允许使用以下之一:
- 扩展的原始转换(第5.1.2节)
- [...]
JLS 5.1.2扩展原始转换
以下19种基本类型的特定转换称为扩展基元转换:
int到long,float或double- [...]
如上所述,还有D或d后缀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字母L或l(ell),则为整数文字; 否则它是类型int.后缀L是首选,因为letterl(ell)通常很难与digit1(one)区分开来.
您正在double为float变量赋值. 编译器假定1.1它本身(没有在f末尾添加)double.编译器不喜欢进行隐式向下转换,因为有可能失去精度.