Java 将int/long零转换为double

Java 将int/long零转换为double,java,integer,double,type-conversion,long-integer,Java,Integer,Double,Type Conversion,Long Integer,考虑此代码段: int i = 0; double d1 = (double) i; long l = 0L; double d2 = (double) l; 在我的机器上运行此命令可为两种转换打印0.0但是d1和d2可以是0.0以外的任何东西吗? 据我所知,这是一个扩大的原语转换,其: 加宽基元转换不会丢失有关 数值的总大小 以及 整型或长型值到浮点或长型值的加宽转换 值加倍,可能会导致精度损失 据我所知,上述规范意味着int 0将始终成为double 0.0,但long 0可以转换为其他内

考虑此代码段:

int i = 0;
double d1 = (double) i;
long l = 0L;
double d2 = (double) l;
在我的机器上运行此命令可为两种转换打印
0.0
但是
d1
d2
可以是
0.0
以外的任何东西吗?

据我所知,这是一个扩大的原语转换,其:

加宽基元转换不会丢失有关 数值的总大小

以及

整型或长型值到浮点或长型值的加宽转换 值加倍,可能会导致精度损失

据我所知,上述规范意味着
int 0
将始终成为
double 0.0
,但
long 0
可以转换为其他内容(例如
1E-20
或类似内容)。我的规范解释正确吗?

完整的引用是:

将int或long值扩大到float,或将long值扩大到double,可能会导致精度损失—也就是说,结果可能会丢失一些值的最低有效位在这种情况下,生成的浮点值将是整数值的正确四舍五入版本,使用IEEE 754四舍五入至最近模式。

(强调矿山)


这涵盖了
int
/
long
值不能在
float
/
double
中精确表示的情况(在这种情况下,选择最接近的可表示值)。很明显,
0
可以表示,因此人们不会期望精度损失。

这是有道理的(即使没有阅读规范)-但我担心的是-JVM可能会进行糟糕的
长->双
转换并保持完全合法,至少就规范而言。@mindas:听起来要求的是必须根据IEEE-754规则正确地对值进行四舍五入。我可能是错的,但根据上面的段落,我看不出将0转换为非0是如何有效的。+1所有
int
都可以用双精度表示。(int有31位带符号,double有53位带符号)它的
可以有double不能精确表示的值。怎么会有零的“精度损失”?零没有任何精度损失。这不是一个真正的问题。事实上,我已经回答了这个问题,里面没有FUD。尽量不要反应过度。