将int类型除以int类型并将结果存储到double类型中会产生意外的结果。

8

我有一个奇怪的问题。

这段代码只是将一个整数除以另一个整数,将结果存储在一个双精度变量中,并打印出来:

int a = 200;
int b = 557;

double divisionResult = a / b;

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

执行此代码后,输出结果为:
Result: 0

这很奇怪,因为 200/5570.3590664272890485

我注意到如果我在除法运算中将 ab 转换成 double 类型

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

它完美地工作。

为什么我必须将变量转换为double才能获得真正的除法结果?


1
这是正常的。int/int=int 的结果。如果你想改变结果类型,你需要将至少一个参数的类型更改为浮点数,如 floatdouble - Pshemo
1
请注意,您只需要将两个操作数中的一个强制转换为双精度除法。 - zakinster
4个回答

10

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

请注意,您不必强制转换两个整数,只需转换一个整数,第二个整数将隐式转换。

为什么转换后它起作用呢?

因为转换比 / 优先级高。 所以首先进行转换,然后进行除法运算。 如果不是这种情况,您将获得 0.0 。


即使 cast 的优先级低于 /,操作者的除法仍然有效,因为右操作数会被强制转换。 - zakinster

1

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

正如您所观察到的,将其中一个或两个 int 更改为double,使计算成为double除法,而不是整数除法。


1

a是整数,b也是整数,将a/b相除的结果为整数,因此0.35转换为整数后变成了0。因此你需要进行强制类型转换,如下所示:

double d = (double)a/b;

2
请注意,这仅适用于强制转换运算符除法运算符具有更高的优先级,这一点乍一看并不明显。 - zakinster

0

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

你对a和b进行整数除法。结果是整数0。然后你将结果赋值给一个double。

你可以将a或b中的任意一个转换为double类型,Java会自动识别并给你一个double类型的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接