一尘不染

Java为什么将long(64)转换为float(32)被认为变宽了?

java

正如甲骨文所说

来自 Oracle
Docs的

参考

扩展基元转换19个特定于基元类型的转换称为扩展基元转换:

  1. 字节到short,int,long,float或double
  2. 短至int,long,float或double
  3. char转换为int,long,float或double
  4. int转换为long,float或double
  5. 多长时间浮动或翻倍
  6. 浮动到两倍

如果浮点数具有32位,而long则具有64位,那么如何考虑加宽?难道这不应该被视为缩小?


阅读 167

收藏
2020-12-03

共1个答案

一尘不染

可以由a表示的值的范围floatdouble比可以由a表示的范围大得多long。虽然从转换时,人们可能会失去显著数字longfloat,它仍然是一个“拉”操作,因为范围更广。

根据Java语言规范§5.1.2

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

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

2020-12-03