在java中,隐式转换的层次结构是byte -> short -> int -> long -> float -> double
,Long可以容纳8个字节的数据。那么,为什么它是隐式类型的浮动,它只能容纳4个字节,而不是双倍,可以容纳8 bytes.Why,它不被认为是缩小?
哪些原语类型将隐式转换为char?
发布于 2014-02-27 11:46:21
这与使用多少位数据无关。它是关于可以被表示的尺度。
来自JLS第5.1.2节(拓宽原语转换)
扩大的原语转换不会丢失有关数字值的总体大小的信息。 ..。 若将int或长值转换为浮动,或将长值转换为双倍,则可能会导致精度下降--也就是说,结果可能会丢失一些最不重要的值。在这种情况下,产生的浮点值将是整数值的正确舍入版本,使用IEEE 754轮到最近模式(§4.2.4)。
long
的范围比float
的范围小得多,但固定的精度为1,float
的精度在绝对值上是不同的。换句话说,没有一个long
超出了float
的范围,但是有一些long
值不能精确地表示为float
值。
迁移到double
无助于此--有些long
值也不能精确地表示为double
。
发布于 2021-09-25 05:08:33
仅仅因为long需要8个字节,float就只有4个字节。Java是如何将这8个字节填充成4个字节的?数据将会丢失。难到不是么?
从长(8字节)到浮点数(4字节)的转换是隐式的,因为浮点数以指数的形式保存值。
浮动存储值以指数的形式存储,这意味着2345678将存储为2.345678E6,其中E6代表10到6的幂
因此,当我们存储一个长值(当然不能存储在浮点数中)时,JVM会将其转换为指数形式,然后存储它。比方说,如果我们想要在浮点数中存储1234567891234的长值,那么它首先将被转换成如下指数形式: 1.234567891234E12,这样就可以将值存储在浮动变量中,这实际上是隐式的。
坚持住!你可能注意到的事情仍然很少。那么精确性呢?小数点后浮点数的精度为6-7位?我还在失去数据。
这里还有一个来自数据存储的概念。JVM并不关心精度的损失。它只关心震级的损失。在上面的例子中,1是数量级,小数位之后的数字是精度。
https://stackoverflow.com/questions/22067409
复制相似问题