Java的:双VS浮动
-
16-09-2019 - |
题
在另一个布鲁斯埃克尔锻炼,我已经编写的代码发生在另一个类的方法和变化值。这是我的代码:
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
无法double
s是float
s以及?
由于事先
解决方案
是的,但你必须指定,他们是浮动的,否则它们是作为双打处理:
z.b = 2.2f
在“F”处的数量的端部使得它的浮子而不是双
Java将不会自动缩小双为float。
其他提示
没有,浮子可以向上转型自动双打,但双打绝不可能没有显式铸造浮子因为双打具有较大的范围。
浮动范围1.40129846432481707e-45
到3.40282346638528860e+38
双范围是4.94065645841246544e-324d
到1.79769313486231570e+308d
默认情况下,Java将治疗小数(例如“4.3
”)作为double
除非另行通过在数字后加上一个f(例如,“float
”)。
4.3f
您遇到的两行同样的问题。首先,十进制字面解释为双编译器。随后它将尝试将其指定b
,它的类型float
的。由于double
是64位和一个float
只有32位(见 Java的图元文件),爪哇给你指示float
无法适应double
内的错误。解决方案是将一个f添加到十进制文字。
如果你试图做相反的(即分配一个float
到double
),那将是好的,因为你可以内适合float
的32个比特的double
的64。
不要使用浮动。有几乎从来没有一个很好的理由去使用它,一直没有超过十年。只是使用双
can't doubles be floats as well?
没有。每个值或变量具有正好一个类型(双,浮点型,整型,长,等等...)。该 Java语言规范状态到底会发生什么,当你尝试一个类型的值指定给其他类型的变量。一般来说,“小”值“较大”式的分配是允许和隐式进行,但任务在那里可能会丢失信息,因为目标类型是太“小”来保存的起源类型的所有值都不会被允许编译器,即使混凝土值不装配到目标类型。
这就是为什么编译器抱怨分配双值(文字隐含的),以浮点型变量可能会失去信息,而且你必须要么使价值浮动,或通过显式铸造安抚它。
这往往会造成混乱的一个领域是计算,因为这些都是含蓄“扩大”为int的技术原因。因此,如果你乘两个短裤并尝试结果分配给一个短,编译器会抱怨,因为计算的结果是一个int。
浮动范围比双所以浮子可以很容易地在双表示较低,但相反的是不可能的,因为,让说,我们取一个值,该值出然后浮动范围的约定,我们将失去的确切数据期间p>