为什么不输入类型转换就可以将long存储为浮点数

时间:2019-03-06 15:52:58

标签: java casting long-integer

好,所以我知道float是32位十进制。 Double是64位十进制。长为64位整数。那么为什么要使用该值:Float(32位)<-Long(64位)。显然不是Java代码,但是我在Java中引用它。即使将其压缩为32位并失去精度,它也会自动进行转换。因此,这意味着精度无关紧要。但是,除非将double显式转换为int,否则int <-double无效。它的大小较小,它们既是数字又是基元。只是一般规则:十进制数<-整数,与位大小无关。它将循环返回。只是这个规则,一切都可以在Java中的Numbers中工作?显示实际代码:

long L = 10_000L;
float f = L;

请注意,问题具体是关于longfloat而没有显式强制转换,而不是floatlong,而不是显式强制转换。

2 个答案:

答案 0 :(得分:6)

long转换为floatwidening primitive conversion。 Java允许它没有错误,因为...是以这种方式定义的。从链接:

  

原始类型上的19种特定转换称为扩展原始类型转换:

     
      
  • byteshortintlongfloatdouble

  •   
  • shortintlongfloatdouble

  •   
  • charintlongfloatdouble

  •   
  • intlongfloatdouble

  •   
  • longfloatdouble

  •   
     

...

     

intfloat或从 longfloat 或从长时间加倍,可能会导致精度降低-也就是说,结果可能会丢失该值的某些最低有效位。在这种情况下,使用IEEE 754舍入到最近模式(第4.2.4节),结果浮点值将是整数值的正确舍入版本。

(我的重点。)

为什么允许它而不需要显式强制转换?通常,只有詹姆斯·高斯林和当时的其他人可以回答这种问题。对于我们其他人,答案是:因为这就是规范所说的。

但是,我要指出的是,即使精度损失了,总的幅度也没有,我敢打赌这是允许的原因。 float可以精确地保存非常个大值。例如:

class Demo {
    public static void main(String[] args) {
        long l = Long.MAX_VALUE;
        float f = l;
        System.out.println(l);
        System.out.println(f);
    }
}

运行它,您会得到:

9223372036854775807
9.223372E18

9.223372e18是9223372000000000000。比较:

9223372036854775807 - the long value
9223372000000000000 - the float value

这是因为float可以牺牲值范围的精度,因为float存储它会提高到指数的基值。来自Wikipedia's article on the IEEE-754 binary32 format(这是Java的class Demo { public static void main(String[] args) { float f = 16_777_216f; System.out.println(String.format("%8.0f", f)); // 16777216 System.out.println(String.format("%8.0f", f + 1)); // 16777216 (still) } } 的意思):

  

... IEEE 754 32位base-2浮点变量的最大值为(2 − 2 −23 )×2 127 ≈3.402823 ×10 38 ...

3.402823×10 38 是:

340,282,300,000,000,000,000,000,000,000,000,000,000

... 但是它可以存储的最高整数,以便您可以加1而不会损失精度,仅为2 24 -1(16,777,215)。它可以存储16,777,216,但不能存储16,777,217。所以16,777,216 + 1仍然是16,777,216:

long

那是因为它现在存储的是将基值除以2,指数为2,因此它不再存储奇数。您获得的越高,就越糟,只能存储4、8、16的倍数。

float的最大值(即2 63 -1)(仅为“ only”)进行对比:

9,223,372,036,854,775,807

但是与number不同,它可以精确地表示每个整数。

答案 1 :(得分:-3)

有些类似隐式类型转换。如果您不会丢失信息,Javajava会自动强制转换。从浮点到多点,您可能会丢失所有浮点后的内容,因此不会进行隐式强制转换,因为通常您不想丢失此信息。