23

在另一个 Bruce Eckel 练习中,我编写的代码采用一个方法并更改另一个类中的值。这是我的代码:

class Big {
  float b;
}

public class PassObject {
  static void f(Letter y) {
    y.c = 'z';
  } //end f()
  static void g(Big z) {
    z.b = 2.2;
  }

  public static void main(String[] args ) {
    Big t = new Big();
    t.b = 5.6;
    System.out.println("1: t.b : " + t.b);
    g(x);
    System.out.println("2: t.b: " + t.b);
  } //end main
}//end class

它抛出一个错误,说“可能失去精度”。

PassObject.java:13: possible loss of precision
found: double
required : float   z.b = 2.2
passobject.java:20: possible loss of precision
found : double
required : float   t.b = 5.6

doubles不能也floats吗?

4

6 回答 6

32

是的,但是您必须指定它们是浮点数,否则它们将被视为双精度数:

z.b = 2.2f

数字末尾的“f”使其成为浮点数而不是双精度数。

Java 不会自动将双精度数缩小为浮点数。

于 2009-04-24T19:17:23.883 回答
18

不,浮点数可以自动向上转换为双精度数,但是如果没有显式转换,双精度数永远不会是浮点数,因为双精度数具有更大的范围。

浮动范围1.40129846432481707e-453.40282346638528860e+38

双范围4.94065645841246544e-324d1.79769313486231570e+308d

于 2009-04-24T19:16:11.437 回答
9

默认情况下,Java 会将小数(例如“ 4.3”)视为 a double,除非您float通过在数字后添加 f 来指定 a(例如“ 4.3f”)。

你在两条线上都有同样的问题。首先,十进制文字被编译器解释为双精度。然后它尝试将其分配给b类型为 的float。由于 adouble是 64 位,而 afloat只有 32 位(请参阅Java 的原语文档float),Java会给您一个错误,表明double. 解决方案是将 f 添加到您的十进制文字中。

如果您试图做相反的事情(即将 a 分配float给 a double),那没关系,因为您可以将 afloat的 32 位放入 adouble的 64 位。

于 2009-04-24T19:31:26.220 回答
6

不要使用浮动。几乎没有充分的理由使用它,而且已经有十多年没有使用它了。只需使用双倍。

于 2009-04-25T01:15:13.540 回答
3
can't doubles be floats as well?

不,每个值或变量都只有一种类型(double、float、int、long 等)。Java 语言规范准确地说明了当您尝试将一种类型的值分配给另一种类型的变量时会发生什么。通常,允许并隐式地将“较小”值分配给“较大”类型,但是由于目标类型太“小”而无法容纳原始类型的所有值而导致信息丢失的分配是不允许的。编译器,即使具体值确实适合目标类型。

这就是为什么编译器抱怨为浮点变量分配一个双精度值(字面意思是隐含的)可能会丢失信息,您必须通过将值设为浮点数或显式转换来安抚它。

经常引起混淆的一个领域是计算,因为出于技术原因,这些都隐含地“扩大”到 int 。因此,如果您将两个 short 相乘并尝试将结果分配给一个 short,编译器会报错,因为计算的结果是一个 int。

于 2009-04-24T19:37:35.007 回答
0

浮点范围低于双精度,因此浮点可以很容易地用双精度表示,但反过来是不可能的,因为假设我们取一个超出浮点范围的值,那么在约定期间我们将丢失确切的数据

于 2014-09-29T17:44:15.443 回答