整数除法:如何生成双精度值?

2022-08-31 05:11:30

对于此代码块:

int num = 5;
int denom = 7;
double d = num / denom;

的值为 。它可以通过铸造来强制工作:d0.0

double d = ((double) num) / denom;

但是,还有另一种方法可以获得正确的结果吗?我不喜欢投射原语,谁知道会发生什么。double


答案 1
double num = 5;

这样可以避免施法。但您会发现,转换转换是定义明确的。您不必猜测,只需检查JLS即可。int 到 double 是一种加宽转换。根据 §5.1.2

加宽基元转换不会丢失有关数值总体大小的信息。

[...]

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

5 可以精确地表示为双精度值。


答案 2

投射基元有什么问题?

如果你因为某种原因不想投,你可以做

double d = num * 1.0 / denom;