【问题标题】:Converting int/long zero to double将 int/long 零转换为 double
【发布时间】:2013-01-20 07:28:25
【问题描述】:

考虑到这段代码sn-p:

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

在我的机器上运行它会为两种转换打印0.0但是d1d2 可以不是0.0 吗?

据我了解,这是一个 扩大的原始转换spec says:

扩展原语转换不会丢失有关 数值的总大小。

还有

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

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

【问题讨论】:

  • “精度损失”怎么可能为零?零没有任何精度可以丢失。不是一个真正的问题。
  • 事实上我已经回答了这个问题,而且其中没有任何 FUD。尽量不要反应过度。

标签: java integer double type-conversion long-integer


【解决方案1】:

完整的报价是:

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

(强调我的)

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

【讨论】:

  • 这确实有道理(即使没有阅读规范) - 但我担心的是 - 一些极端情况,JVM 可以 进行糟糕的long->double 转换并保持完美合法,至少就规范而言。
  • @mindas:听起来要求必须根据 IEEE-754 规则正确舍入该值。我可能是错的,但根据上面的段落,我看不出 0 被转换为非 0 是如何有效的。
  • +1 所有int 都可以用双精度表示。 (int 有 31 位带符号,double 有 53 位带符号)long 可以有 double 不能准确表示的值。
猜你喜欢
  • 1970-01-01
  • 2013-03-15
  • 2015-08-23
  • 2021-12-03
  • 2019-06-30
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 2011-05-10
相关资源
最近更新 更多