Java:d​​ouble vs float

phi*_*ill 22 java floating-point double types casting

在另一个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
Run Code Online (Sandbox Code Playgroud)

它抛出的错误是"可能会损失精确度".

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
Run Code Online (Sandbox Code Playgroud)

不可能doublefloats?

提前致谢

mip*_*adi 32

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

z.b = 2.2f
Run Code Online (Sandbox Code Playgroud)

数字末尾的'f'使其成为浮点而不是双精度.

Java不会自动将double缩小为float.


Pow*_*ord 17

不,浮动可以自动向上转换为双打,但是如果没有明确的转换,双打永远不会浮动,因为双打具有更大的范围.

浮动的范围是1.40129846432481707e-453.40282346638528860e+38

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

  • '浮动可以是双打,但双打永远不会浮动'.那是错的.如果双打位于浮球范围内,则双打可以是浮点数. (9认同)

mtl*_*nch 9

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

你在这两行都有同样的问题.首先,编译器将十进制文字解释为double.然后它尝试将其分配给b类型float.由于a double是64位且a float只有32位(参见Java的原语文档),Java会给出一个错误,指示它float不适合double.解决方案是在您的小数文字中添加一个f.

如果你试图做相反的事情(float即将a 分配给a double),那就没关系,因为你可以floatdouble64的64 位内得到一个32位.


Pet*_*rey 6

不要使用浮动.几乎没有充分的理由使用它并且已经超过十年了.只需使用双倍.