在另一个布鲁斯埃克尔锻炼,我已经编写的代码发生在另一个类的方法和变化值。这是我的代码:

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以及?

由于事先

有帮助吗?

解决方案

是的,但你必须指定,他们是浮动的,否则它们是作为双打处理:

z.b = 2.2f

在“F”处的数量的端部使得它的浮子而不是双

Java将不会自动缩小双为float。

其他提示

没有,浮子可以向上转型自动双打,但双打绝不可能没有显式铸造浮子因为双打具有较大的范围。

浮动范围1.40129846432481707e-453.40282346638528860e+38

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

默认情况下,Java将治疗小数(例如“4.3”)作为double除非另行通过在数字后加上一个f(例如,“float”)。

指定4.3f

您遇到的两行同样的问题。首先,十进制字面解释为双编译器。随后它将尝试将其指定b,它的类型float的。由于double是64位和一个float只有32位(见 Java的图元文件),爪哇给你指示float无法适应double内的错误。解决方案是将一个f添加到十进制文字。

如果你试图做相反的(即分配一个floatdouble),那将是好的,因为你可以内适合float的32个比特的double的64。

不要使用浮动。有几乎从来没有一个很好的理由去使用它,一直没有超过十年。只是使用双

can't doubles be floats as well?

没有。每个值或变量具有正好一个类型(双,浮点型,整型,长,等等...)。该 Java语言规范状态到底会发生什么,当你尝试一个类型的值指定给其他类型的变量。一般来说,“小”值“较大”式的分配是允许和隐式进行,但任务在那里可能会丢失信息,因为目标类型是太“小”来保存的起源类型的所有值都不会被允许编译器,即使混凝土值不装配到目标类型。

这就是为什么编译器抱怨分配双值(文字隐含的),以浮点型变量可能会失去信息,而且你必须要么使价值浮动,或通过显式铸造安抚它。

这往往会造成混乱的一个领域是计算,因为这些都是含蓄“扩大”为int的技术原因。因此,如果你乘两个短裤并尝试结果分配给一个短,编译器会抱怨,因为计算的结果是一个int。

浮动范围比双所以浮子可以很容易地在双表示较低,但相反的是不可能的,因为,让说,我们取一个值,该值出然后浮动范围的约定,我们将失去的确切数据

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top