考虑此代码段:
int i = 0;
double d1 = (double) i;
long l = 0L;
double d2 = (double) l;
在我的机器上运行此功能会为两次转换打印0.0
。 但d1
和d2
除了0.0
之外什么都可以?
据我了解,这是扩展基元转换 spec says:
扩展的原始转换不会丢失有关的信息 数值的整体幅度。
以及
将int或long值的扩展转换为float或long 值加倍,可能导致精度损失
据我了解规范,上述内容意味着int 0
将永远变为double 0.0
但long 0
可以转换为其他内容(例如1E-20
或类似的内容)。我的规范解释是否正确?
答案 0 :(得分:3)
完整的引用是:
将int或long值扩展为float,或将long值转换为double,可能会导致精度损失 - 也就是说,结果可能会丢失该值的一些最低有效位。 在这种情况下,生成的浮点值将是整数值的正确舍入版本,使用IEEE 754舍入到最接近模式。
(强调我的)
这涵盖了无法在int
/ long
中准确表示float
/ double
值的情况(在这种情况下,会选择最接近的可表示值) 。显然,0
可以表示,因此人们不会指望精度会降低。