1

考虑到这个代码片段:

int i = 0;
double d1 = (double) i;
long l = 0L;
double d2 = (double) l;

在我的机器上运行这0.0两种转换。但是可以d1而且d2永远不是0.0吗?

据我了解,这是规范中所说的扩大原始转换

加宽基元转换不会丢失有关数值整体大小的信息。

将 int 或 long 值转换为 float,或将 long 值转换为 double,可能会导致精度损失

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

4

1 回答 1

3

完整的报价是:

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

(强调我的)

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

于 2013-02-05T11:25:56.203 回答