看下面的三行代码。
float f = 1;
float g = 1.1;
float h = 1.1f;
第二行有编译错误,而其他行没有编译错误。第一行在没有后缀 f 的情况下工作正常,第三行在后缀 f 下工作。为什么是这样?
看下面的三行代码。
float f = 1;
float g = 1.1;
float h = 1.1f;
第二行有编译错误,而其他行没有编译错误。第一行在没有后缀 f 的情况下工作正常,第三行在后缀 f 下工作。为什么是这样?
您正在double
为float
变量赋值。 编译器假定1.1
其本身(没有f
附加在最后)是 类型double
。编译器不喜欢进行隐式向下转换,因为那里可能会失去精度。
第一行自动转换int
为float
(ok)。
由于精度损失,第二行无法投射double
到float
。您可以进行显式转换:
float g = (float) 1.1;
第三行不需要修改。
在 Java 中,每个浮点数(任何带小数点的数字)都默认为 a double
,这比 a 更精确float
。默认情况下,由于精度损失,Java 不允许您将 a 转换double
为 a float
。
您仍然可以分配double
到float
通过浇注:
float g = (float) 1.1;
Java 中的浮点文字
double
默认是一个值。您不能
double
在float
没有显式收缩转换的情况下为 a赋值。因此,您有两个选择:f
或F
来表示一个float
值(float)
后者的一个例子是:
关于扩大转化
编译的原因:
是因为从
int
to的扩展转换float
可以在赋值的上下文中隐式完成。文字的其他数据类型后缀
如上所述,还有
D
或d
后缀double
。例如,考虑这个片段:long
文字还有一个后缀,即L
orl
(小写字母)。这是强烈建议您使用大写字母变体。