正在将int/long零转换为双精度



考虑以下代码片段:

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

在我的机器上运行此程序将为两个转换打印0.0但是d1d2可能不是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可以表示,因此不会出现精度损失。

相关内容

  • 没有找到相关文章

最新更新