6

我有一个奇怪的问题。

这段代码只是将一个 int 除以另一个 int,将结果存储在一个 double 变量中并打印出来:

int a = 200;
int b = 557;

double divisionResult = a / b;

System.out.println("Result: " + divisionResult);

执行此代码后,输出为:

Result: 0

这很奇怪,因为200/5570.3590664272890485

我注意到如果我在分区线中投射abdouble

double divisionResult = (double) a / (double) b;

它完美地工作。

为什么我必须将变量加倍才能得到真正的除法结果?

4

4 回答 4

9

因为在整数除法中,如果答案不是完美整数,则小数点后的数字将被删除(整数除法产生整数值)。

请注意,您不必同时转换两个整数,您只能转换一个,第二个将被隐式转换。

为什么在演员表之后它会起作用?

因为 cast 的优先级高于/. 所以它首先投射,然后分裂。如果不是这种情况,你会得到0.0.

于 2013-05-02T11:57:21.123 回答
1

a 是 int,b 是 int,除以 a/b 会得到一个 int 值,因此 0.35 转换为 int 变为 0。所以你必须将它转换为

double d = (double)a/b;
于 2013-05-02T12:00:02.527 回答
1

与往常一样,赋值运算符右侧的任何计算都会在将其结果分配给左侧指定的变量之前执行。执行计算时,它是两个ints 之间的除法,这是一个整数除法,它(我相信你知道)产生一个整数结果(即没有任何余数的商)。只有在执行此计算之后,整数除法的结果(即 0)才会转换为双精度数。

正如您所观察到的,将一个或两个ints 更改为双精度数会使计算成为双除法,而不是整数除法。

于 2013-05-02T11:57:29.013 回答
0

因为你现在的做法是这样的:

您对 a 和 b 进行整数除法。其结果是整数 0。之后,您将结果分配给双精度数。

您可以将 a 或 b 转换为 double,Java 会识别出这一点并因此给您一个 double。

于 2013-05-02T12:01:20.467 回答