在另一个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
double
也不能float
?
提前致谢
答案 0 :(得分:32)
是的,但您必须指定它们是浮点数,否则它们将被视为双打:
z.b = 2.2f
数字末尾的'f'使它成为浮点数而不是双数。
Java不会自动将double缩小为float。
答案 1 :(得分:17)
不,浮动可以自动向上转换为双打,但是如果没有明确的转换,双打永远不会浮动,因为双打具有更大的范围。
浮动范围为1.40129846432481707e-45
至3.40282346638528860e+38
双倍范围是4.94065645841246544e-324d
到1.79769313486231570e+308d
答案 2 :(得分:9)
默认情况下,Java会将小数(例如“4.3
”)视为double
,除非您通过在数字后添加f来指定float
(例如“{{ 1}}“)。
你在两条线上遇到同样的问题。首先,编译器将十进制文字解释为double。然后,它会尝试将其分配给4.3f
,其类型为b
。由于float
为64位且double
仅为32位(请参阅Java's primitives documentation),因此Java会向您显示错误,指示float
不能容纳float
}}。解决方案是在您的小数文字中添加一个f。
如果您尝试执行相反的操作(即将double
分配给float
),那就可以了,因为您可以在double
的32位内放置float
{1}}是64。
答案 3 :(得分:6)
不要使用浮动。几乎没有充分的理由使用它并且已经超过十年了。只需使用双倍。
答案 4 :(得分:3)
can't doubles be floats as well?
没有。每个值或变量只有一种类型(double,float,int,long等)。 Java Language Specification确切地说明当您尝试将一种类型的值分配给另一种类型的变量时会发生什么。通常,允许并隐式地将“较小”值分配给“较大”类型,但是由于目标类型太小而不能保存原始类型的所有值,因此不允许将信息丢失的分配。编译器,即使具体值确实适合目标类型。
这就是为什么编译器抱怨为float变量赋值double值(文字隐式为)可能会丢失信息,你必须通过使值为float或者显式转换来安抚它。
经常导致混淆的一个方面是计算,因为出于技术原因,这些区域被隐式“扩展”为int。因此,如果你将两个short乘以并尝试将结果赋值为short,编译器会抱怨,因为计算结果是int。
答案 5 :(得分:0)
浮点范围小于double,因此float可以很容易地用double表示,但反过来是不可能的,因为,假设我们取一个超出浮动范围的值,那么在约定期间我们将丢失确切的数据