Java为什么将long(64)转换为float(32)被视为加宽?

时间:2013-03-05 16:40:01

标签: java promotions

从oracle说明

来自 Oracle Docs

的参考资料

扩大原始转换 对基本类型的19个特定转换称为扩展基元转换:

  1. byte to short,int,long,float或double
  2. 简称为int,long,float或double
  3. char to int,long,float或double
  4. int to long,float或double
  5. 长期漂浮或加倍
  6. 浮动加倍
  7. 如果一个浮点数有32位而一个长数据有64位,那怎么算是加宽?这不应该被视为缩小范围吗?

4 个答案:

答案 0 :(得分:20)

floatdouble可以表示的值范围远大于long可以表示的范围。虽然从long转换为float时可能会丢失有效数字,但它仍然是“扩大”操作,因为范围更广。

来自Java Language Specification, §5.1.2

  

将int或long值扩展为float,或将long值转换为double,可能会导致精度损失 - 也就是说,结果可能会丢失该值的一些最低有效位。在这种情况下,使用IEEE 754舍入到最接近模式(第4.2.4节),得到的浮点值将是整数值的正确舍入版本。

请注意,double可以准确代表每个可能的int值。

答案 1 :(得分:2)

它被认为是扩大的,因为floatdouble可以代表比long更大的值。您可能会失去精确度,但可以表示该值(至少近似值)。

答案 2 :(得分:2)

它被认为是加宽,因为浮点数可以表示的数字大于可以用long表示的数字。仅仅因为float使用32位精度并不意味着它可以表示的数字限制为2 ^ 32。

例如,float (float)Long.MAX_VALUE+(float)Long.MAX_VALUE大于Long.MAX_VALUE,即使float的精度低于long {{1}}。

答案 3 :(得分:1)

如果你用简单的术语来看问题,那就是原始设计师如何表达数据

理想情况下,long(64)的位深度大于float(32)。但浮动数据使用scientific notion表示 这允许代表更大的范围

Ex:300 [原始号码]:3×102 [科学代表]

长:-2 ^ 63到2 ^ 63-1

浮动:( - 3.4)* 10 ^ 38至(3.4)* 10 ^ 38

注意长(2的幂)Vs Float(10的幂)代表性差异,这允许浮动具有更高的范围

希望这有用