在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