Java 将int/long零转换为double
考虑此代码段:Java 将int/long零转换为double,java,integer,double,type-conversion,long-integer,Java,Integer,Double,Type Conversion,Long Integer,考虑此代码段: int i = 0; double d1 = (double) i; long l = 0L; double d2 = (double) l; 在我的机器上运行此命令可为两种转换打印0.0但是d1和d2可以是0.0以外的任何东西吗? 据我所知,这是一个扩大的原语转换,其: 加宽基元转换不会丢失有关 数值的总大小 以及 整型或长型值到浮点或长型值的加宽转换 值加倍,可能会导致精度损失 据我所知,上述规范意味着int 0将始终成为double 0.0,但long 0可以转换为其他内
int i = 0;
double d1 = (double) i;
long l = 0L;
double d2 = (double) l;
在我的机器上运行此命令可为两种转换打印0.0
但是d1
和d2
可以是0.0
以外的任何东西吗?
据我所知,这是一个扩大的原语转换,其:
加宽基元转换不会丢失有关
数值的总大小
以及
整型或长型值到浮点或长型值的加宽转换
值加倍,可能会导致精度损失
据我所知,上述规范意味着int 0
将始终成为double 0.0
,但long 0
可以转换为其他内容(例如1E-20
或类似内容)。我的规范解释正确吗?完整的引用是:
将int或long值扩大到float,或将long值扩大到double,可能会导致精度损失—也就是说,结果可能会丢失一些值的最低有效位在这种情况下,生成的浮点值将是整数值的正确四舍五入版本,使用IEEE 754四舍五入至最近模式。
(强调矿山)
这涵盖了
int
/long
值不能在float
/double
中精确表示的情况(在这种情况下,选择最接近的可表示值)。很明显,0
可以表示,因此人们不会期望精度损失。这是有道理的(即使没有阅读规范)-但我担心的是-JVM可能会进行糟糕的长->双
转换并保持完全合法,至少就规范而言。@mindas:听起来要求的是必须根据IEEE-754规则正确地对值进行四舍五入。我可能是错的,但根据上面的段落,我看不出将0转换为非0是如何有效的。+1所有int
都可以用双精度表示。(int有31位带符号,double有53位带符号)它的长
可以有double不能精确表示的值。怎么会有零的“精度损失”?零没有任何精度损失。这不是一个真正的问题。事实上,我已经回答了这个问题,里面没有FUD。尽量不要反应过度。