为什么 java 不自动将表达式中的 int 转换为 double?

Why does not java cast int to double in expression automatically?

我的问题:

int a = 30, b = 12, c = 2, d = 5, e = 1;

double result = (double) (a - b / (c * d) + e);

System.out.print("Result = " + (double) result + " - " + result);

结果:

Result = 30.0 - 30.0

我要看的是:29.8!

我有整数,但我想计算一个我需要双精度的表达式。

有没有一种简单的方法可以完成我尝试过的操作?

您必须将表达式中的整数之一转换为 double。实际上,您不能转换任何整数。要转换的重要一个是除法的操作数之一,因为整数除法是您遇到的精度损失的原因)。

例如:

double result = (a - (double)b / (c * d) + e);

double result = (a - b / (double)(c * d) + e);

这将确保使用浮点运算完成除法。

why does not java cast int to double in expression automatically?

因为你没有得到分数值的表达式是纯粹根据你给它的操作数计算的,而不是更大的上下文(这将 可怕地 复杂)。所以 a - bc * d... + e 都适用于 int 值。只有在获得最终结果后,您才会将其转换为 double,并且编译器不会查看更大的上下文并猜测您想要早点这样做(这是一件好事 ( tm)).

如果您希望使用 double 值进行操作,您必须告诉编译器。在这种情况下,您可以将该转换放在多个位置中的任何一个,然后 "bubble up" 到使用结果的任何表达式。您可以将其放在一个位置:

double result = (a - b / (double)(c * d) + e);

Live example

int之间的运算结果为int。所以 12/10 是 int one 1,如果你想得到 double one 1.2,你必须将其中一个表达式转换为 double,比如 double result = (a - (double)b / (c * d) + e);.