Java:d​​ouble vs float

在另一个Bruce Eckel练习中,我编写的代码采用了一种方法,并在另一个类中更改了值。 这是我的代码:

class Big { float b; } public class PassObject { static void f(Letter y) { yc = 'z'; } //end f() static void g(Big z) { zb = 2.2; } public static void main(String[] args ) { Big t = new Big(); tb = 5.6; System.out.println("1: tb : " + tb); g(x); System.out.println("2: tb: " + tb); } //end main }//end class 

这是一个错误,说“可能会失去精确度”。

 PassObject.java:13: possible loss of precision found: double required : float zb = 2.2 passobject.java:20: possible loss of precision found : double required : float tb = 5.6 

不能double float吗?

提前致谢

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

 zb = 2.2f 

数字末尾的“f”使其成为浮点而不是双精度。

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

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

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

双程为4.94065645841246544e-324d1.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。 因此,如果你将两个短路相乘并尝试将结果分配给一个短路,编译器会抱怨,因为计算结果是一个int。

float范围小于double,因此float可以很容易地用double表示,但反过来是不可能的,因为,假设我们取一个超出浮点范围的值,那么在约定期间我们将丢失确切的数据