对于此代码块:
int num = 5; int denom = 7; double d = num / denom;
的d值为0.0。它可以通过强制转换强制工作:
d
0.0
double d = ((double) num) / denom;
但是还有其他方法可以得到正确的double结果吗?我不喜欢铸造原语,谁知道会发生什么。
double
double num = 5;
这避免了演员表。但是您会发现演员转换是明确定义的。您不必猜测,只需检查JLS即可。int 到 double 是一个扩大的转换。从搂5.1.2:
加宽基元转换不会丢失有关数值整体大小的信息。 […] 将 int 或 long 值转换为 float,或将 long 值转换为 double,可能会导致精度损失——也就是说,结果可能会丢失一些值的最低有效位。在这种情况下,生成的浮点值将是整数值的正确舍入版本,使用 IEEE 754 舍入到最近模式(拥抱4.2.4)。
加宽基元转换不会丢失有关数值整体大小的信息。
[…]
将 int 或 long 值转换为 float,或将 long 值转换为 double,可能会导致精度损失——也就是说,结果可能会丢失一些值的最低有效位。在这种情况下,生成的浮点值将是整数值的正确舍入版本,使用 IEEE 754 舍入到最近模式(拥抱4.2.4)。
5 可以精确地表示为双精度数。