Java:双重vs浮动

Java:双重vs浮动,java,types,casting,floating-point,double,Java,Types,Casting,Floating Point,Double,在另一个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 ) {

在另一个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
它抛出了一个错误,说“可能会失去精度。”

double
s不能也是
float
s吗


提前感谢

否,浮点数可以自动向上投射到双打,但是双打在没有显式投射的情况下永远不能是浮点数,因为双打的范围更大

浮动范围为
1.40129846432481707e-45
3.40282346638528860e+38


双精度范围是
4.94065645841246544e-324d
1.79769313486231570e+308d

是,但必须指定它们是浮点数,否则它们将被视为双精度:

z.b = 2.2f
数字末尾的“f”使其成为浮点,而不是双精度


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

默认情况下,Java会将十进制(例如“
4.3
”)视为
double
,除非您通过在数字后添加一个f(例如“
4.3f
”)来指定一个
float

两条线路上的问题都一样。首先,编译器将十进制文本解释为double。然后,它尝试将其分配给
b
,类型为
float
。由于
double
为64位,而
float
仅为32位(请参阅),因此Java会给出一个错误,指示
float
无法放入
double
中。解决方案是在十进制文本中添加一个f

如果您尝试执行相反的操作(即将
浮点
分配给
双精度
),那就没问题了,因为您可以将
浮点
的32位放在
双精度
的64位中

can't doubles be floats as well?
不可以。每个值或变量只有一种类型(double、float、int、long等)。当您尝试将一种类型的值赋给另一种类型的变量时,这些变量会精确地说明发生了什么。通常,允许并隐式地将“较小”值赋值给“较大”类型,但编译器不允许将信息丢失的赋值,因为目标类型太小,无法容纳源类型的所有值,即使具体值适合目标类型

这就是为什么编译器抱怨将双精度值(字面含义是)赋给浮点变量可能会丢失信息,而您必须通过将该值设为浮点或显式强制转换来安抚它


一个经常引起混淆的领域是计算,因为出于技术原因,计算被隐式地“扩展”为int。因此,如果将两个short相乘,并尝试将结果分配给short,编译器会抱怨,因为计算结果是int。

不要使用float。几乎从来没有一个很好的理由使用它,而且十多年来都没有。只需使用double。

浮点范围小于double,因此可以轻松地用double表示浮点,但不可能用double表示,因为,假设我们取一个超出浮点范围的值,那么在约定过程中,我们将丢失准确的数据。

浮点可以是double,但double永远不能是float。那是错误的。如果double位于float的范围内,则它们可以是float。如果我想像
4.1
那样存储在
float
中,我不能,因为它没有通过
3.4xxx
范围?似乎无法理解为什么上限从
3.xxx开始,而你显然可以存储
999.99
没有问题。我猜你加的小数点越多,在小数点前面可以用的就越少?那么为什么
3.XX
不应该将
0.XX
作为最大值呢?@SSpoke(我从来没有收到过这条评论的通知,所以我现在只是回应一下)这些范围是科学符号。。。对于浮点数的上界,十进制大约为3402823466385286000000000000000000000000000000000000000000000.0。@fabigler,仅当您显式强制转换它时。否则,您将得到一个编译错误。。。问题中提到的编译错误。@Powerlord如果只需要4个字节的数据,float怎么能存储如此大的数字,如
4028234663852886000000000000000000000000000
?我会假设大约40亿是上限,除非浮动有某种压缩?我知道浮点数/双精度浮点数是有损的,并且永远无法存储准确的值,因此不应将其用于货币值。我猜您从未通过Java进行过任何与OpenGL相关的开发…:P@Manius自从我写这篇文章以来,我已经做了8年,但是更强大的GPU意味着在我所处理的用例中使用float或double并没有太大区别。主要问题是将数据足够快地传送到GPU。同意。只是有点挑剔你(是的,这是我现在看到的一个老答案)。:)如果我们现在可以完全转储浮点值就好了,但是…@Manius如果有什么我想看到硬件中128位浮点值的支持等等。哈,这里没有争论!
can't doubles be floats as well?