在Java中表示浮点值
看下面的三行代码。
float f = 1; float g = 1.1; float h = 1.1f;
第二行有编译错误,而其他行没有编译错误。 第一行工作正常,没有后缀f,第三行使用后缀f。 为什么是这样?
Java中的浮点文字默认为double
值。
JLS 3.10.2浮点文字
如果浮点文字后缀为ASCII字母
F
或f
,则浮点文字的类型为float
; 否则其类型为double
,并且可以选择以ASCII字母D
或d
为后缀。
如果没有明确的缩小转换,则不能将double
值赋给float
。 因此,您有两种选择:
- 对于文字,使用后缀
f
或F
表示float
值 - 对于非文字,使用显式强制转换
(float)
后者的一个例子是:
double d = 1.1; float f = (float) d; // compiles fine!
在扩大转换
这个编译的原因是:
float f = 1;
是因为从int
到float
的扩展转换可以在赋值的上下文中隐式完成。
JLS 5.2分配转换
将表达式的值赋给变量时会发生赋值转换 :必须将表达式的类型转换为变量的类型。 赋值上下文允许使用以下之一:
- 扩展的原始转换(第5.1.2节)
- […]
JLS 5.1.2扩展原始转换
以下19种关于基本类型的特定转换称为扩展基元转换 :
int
到long
,float
或double
- […]
文字的其他数据类型后缀
如上所述,还有double
的D
或d
后缀。 请考虑以下代码段:
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
文字的后缀,即L
或l
(小写字母)。 强烈建议您使用大写变体。
JLS 3.10.1整数文字
如果整数文字后缀为ASCII字母
L
或l
(ell
),则整数文字的长度为long
; 否则它是int
类型。 后缀L
是优选的,因为字母l
(ell
)通常难以与数字1
(one
)区分开。
您正在为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;