在Java中表示浮点值

时间:2010-06-13 17:16:51

标签: java floating-point

请看下面的三行代码。

  float f = 1;

  float g = 1.1;

  float h = 1.1f;

第二行有编译错误,而其他行没有编译错误。第一行工作正常,没有后缀f,第三行使用后缀f。这是为什么?

4 个答案:

答案 0 :(得分:21)

默认情况下,Java中的浮点文字值为double

  

JLS 3.10.2 Floating-Point Literals

     

浮点文字的类型为float,如果后缀为ASCII字母Ff;否则其类型为double,并且可以选择以ASCII字母Dd为后缀。

如果没有明确的缩小转化,您无法为double分配float值。因此,您有两个选择:

  • 对于文字,请使用后缀fF来表示float
  • 对于非文字,请使用显式广告(float)

后者的一个例子是:

double d = 1.1;
float f = (float) d; // compiles fine!

关于扩大转化次数

编译原因:

float f = 1;

是因为从intfloat的扩展转换可以在作业的上下文中隐式完成。

  

JLS 5.2 Assignment Conversion

     将表达式的值赋给变量时,会发生

分配转换:必须将表达式的类型转换为变量的类型。分配上下文允许使用以下之一:

     
      
  • 扩大原始转换(第5.1.2节)
  •   
  • [...]
  •   
     

JLS 5.1.2 Widening Primitive Conversion

     

以下19种关于基元类型的特定转换称为加宽基元转换

     
      
  • intlongfloatdouble
  •   
  • [...]
  •   

文字的其他数据类型后缀

如上所述,D还有ddouble后缀。请考虑以下代码段:

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个文字的后缀,即Ll(小写字母)。 强烈推荐使用大写变体。

  

JLS 3.10.1 Integer Literals

     

如果整数文字的后缀为ASCII字母longLl),则其类型为ell;否则它是int类型。后缀L是首选,因为字母lell)通常很难与数字1one)区分开来。

答案 1 :(得分:7)

您要为double变量分配float值。编译器假定1.1本身(最后没有加f)为double类型。编译器不喜欢进行隐式向下转换,因为它可能会失去精度。

答案 2 :(得分:0)

第一行autocasts int to float(ok)。

由于精度损失,第二行无法将double转换为float。你必须施展:

float g = (float) 1.1;

第三行不需要转换。

答案 3 :(得分:0)

在Java中,每个浮点数(任何带小数点的数字)默认为double,这比float更精确。默认情况下,Java不允许您将double转换为float,因为精度会降低。

您仍然可以通过投射将double分配给float

float g = (float) 1.1;