Java:双精度 vs 浮点数

2022-09-01 21:41:00

在另一个 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

不能也是s吗?doublefloat


答案 1

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

z.b = 2.2f

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

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


答案 2

不可以,浮点数可以自动上投为双打,但双打永远不能在没有显式投射的情况下浮点数,因为双打具有更大的范围。

浮点数范围为1.40129846432481707e-453.40282346638528860e+38

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