考虑以下代码片段:
int i = 0;
double d1 = (double) i;
long l = 0L;
double d2 = (double) l;
在我的机器上运行此程序将为两个转换打印0.0
但是d1
和d2
可能不是0.0
吗
据我所知,这是一个扩展原语转换,规范中说:
加宽基元转换不会丢失有关数值的总体大小。
以及
int或long值到float或long的加宽转换值翻倍,可能导致精度损失
根据我对规范的理解,上述内容意味着int 0
将始终变为double 0.0
,但long 0
可以转换为其他内容(例如1E-20
或类似内容)。我的规格解释正确吗?
完整报价为:
将int或long值扩展为float,或将long值转换为double,可能会导致精度损失,也就是说,结果可能会丢失该值的一些最低有效位在这种情况下,生成的浮点值将是整数值的正确舍入版本,使用IEEE 754四舍五入到最近模式
(强调矿)
这涵盖了int
/long
值不能在float
/double
中精确表示的情况(在这种情况下,选择最接近的可表示值)。显然,0
可以表示,因此不会出现精度损失。