[英]Java: double vs float
在另一个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
吗?
提前致谢
是的,但您必须指定它们是浮点数,否则它们被视为双打:
z.b = 2.2f
数字末尾的'f'使其成为浮点而不是双精度。
Java不会自动将double缩小为float。
不,浮动可以自动向上转换为双打,但是如果没有明确的转换,双打永远不会浮动,因为双打具有更大的范围。
浮动范围是1.40129846432481707e-45
到3.40282346638528860e+38
双程为4.94065645841246544e-324d
至1.79769313486231570e+308d
默认情况下,Java会将小数(例如“ 4.3
”)视为double
除非您通过在数字后面添加f来指定float
(例如“ 4.3f
”)。
你在这两行都有同样的问题。 首先,编译器将十进制文字解释为double。 然后它尝试将它分配给b
,它是float
类型。 由于double
是64位而float
只有32位(参见Java的原语文档 ),Java会给出一个错误,指示float
不能放在double
。 解决方案是在您的小数文字中添加一个f。
如果你试图做相反的事情(即将一个float
赋给一个double
float
),那就没关系了,因为你可以在一个double
精子64中调整float
的32位。
不要使用浮动。 几乎没有充分的理由使用它并且已经超过十年了。 只需使用双倍。
can't doubles be floats as well?
不。每个值或变量只有一种类型(double,float,int,long等)。 Java语言规范准确说明了当您尝试将一种类型的值分配给另一种类型的变量时会发生什么。 通常,允许并隐式地将“较小”值分配给“较大”类型,但是由于目标类型太小而不能保存原始类型的所有值,因此不允许将信息丢失的分配。编译器,即使具体值适合目标类型。
这就是为什么编译器抱怨将double值(字面意思是隐含的)赋值给float变量可能会丢失信息,并且你必须通过使值成为float或通过显式转换来安抚它。
经常导致混淆的一个领域是计算,因为出于技术原因,它们被隐式“扩展”为int。 因此,如果将两个short乘以并尝试将结果赋值为short,编译器将会抱怨,因为计算结果为int。
float范围小于double,因此float可以很容易地用double表示,但反过来是不可能的,因为,假设我们取一个超出浮点范围的值,那么在约定期间我们将丢失确切的数据
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.