在Java中表示浮点值
请看下面的三行代码在Java中表示浮点值,java,floating-point,Java,Floating Point,请看下面的三行代码 float f = 1; float g = 1.1; float h = 1.1f; 第二行有编译错误,而其他行没有编译错误。第一行没有后缀f,工作正常,第三行有后缀f。这是为什么?您正在将一个double值分配给float变量1.1本身(没有在末尾加上f)被编译器假定为double类型。编译器不喜欢进行隐式向下转换,因为可能会丢失精度。第一行自动将int转换为float(确定) 由于精度损失,第二行无法将double转换为float。您可以进行显式强制转
float f = 1;
float g = 1.1;
float h = 1.1f;
第二行有编译错误,而其他行没有编译错误。第一行没有后缀f,工作正常,第三行有后缀f。这是为什么?您正在将一个
double
值分配给float
变量1.1
本身(没有在末尾加上f
)被编译器假定为double
类型。编译器不喜欢进行隐式向下转换,因为可能会丢失精度。第一行自动将int
转换为float
(确定)
由于精度损失,第二行无法将double
转换为float
。您可以进行显式强制转换:
float g = (float) 1.1;
第三行不需要修改。在Java中,每个浮点数(任何带小数点的数字)默认为
双精度
,比浮点
更精确。默认情况下,Java不允许您将double
转换为float
,因为会丢失精度
您仍然可以通过强制转换将double
分配给float
:
float g = (float) 1.1;
默认情况下,Java中的浮点文本是一个
双精度值
如果浮点文本的后缀是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
的加宽转换可以在赋值上下文中隐式完成
将表达式的值赋给变量时,会发生赋值转换:表达式的类型必须转换为变量的类型。分配上下文允许使用以下内容之一:
- 扩大原语转换(§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
(小写字母)。强烈建议您使用大写变体
如果整数文本的后缀是ASCII字母L
或L
(ell
),则该整数文本的类型为long
;否则它的类型为int
。首选后缀L
,因为字母L
(ell
)通常很难与数字1
(one
)区分
(更明确地说,Java中的浮点常量默认为double
,除非它们的末尾包含f
,这使得它们float
)