Java中的数学方程式是如何工作的?

6

当我做类似这样的事情时

int test = 5 + 3 * (4 - 1) / 2;

我得到了数字9。我怀疑这是因为int向下舍入。然而,当我执行以下操作:
float test = 5 + 3 * (4 - 1) / 2;

我也得到了9。但是,当我这样做时
float test1 = 5;
float test2 = 4.5;
float test = test1 + test2;

测试最终输出9.5。有人能解释一下背后的逻辑吗?为什么我在第二个例子中没有得到9.5?谢谢。


整数除法在很多语言中都是这样做的,不仅仅是Java。所有C语言都是这样的:C,C ++,C#,Java和JavaScript。 - duffymo
4个回答

17
在你的第二个示例中,虽然你将结果分配给一个float类型的变量,但计算本身仍然与第一个示例完全相同。Java不会根据目标变量类型来确定如何计算右侧。特别是,子表达式3 * (4 - 1) / 2的结果为4
要解决这个问题,你可以使用浮点数字面量而不是所有整数:
float test = 5 + 3 * (4 - 1) / 2.0f;

使用2.0f会触发算术表达式的浮点计算。


这很有道理,但似乎会有点麻烦跟踪。谢谢。 - glcohen
大多数情况下,您将使用一个或多个已经具有“float”或“double”类型的现有变量进行计算。在这种情况下,您不必担心这个问题。 - Greg Hewgill

3

虽然您使用浮点数表示 5 + 3 *(4-1)/ 2 的结果,但实际评估是使用整数精度进行的,这意味着 9 / 2 的除法返回值为4,而不是如果它们被评估为浮点数,则将收到4.5。


2

表达式有自己的类型。所以开始时要:

5 + 3 * (4 - 1) / 2

每个值都有自己的类型。这个类型恰好是int,因此这与以下代码相同:
((int)5) + ((int)3) * (((int)4) - ((int)1)) / ((int)2)

使其更清晰,我们正在处理整数。只有在这被评估为 9 之后,它才会被分配给浮点数。

0

简单来说,整数类型使用模运算,以模1为基础,并且舍弃余数。

由于您将test转换为整数,因此使用模1进行模运算(例如9.5 mod 1), int test = 5 + 3 * (4 - 1) / 2;

如果使用32位或64位浮点数,结果应为9.5;然而,由于您将test转换为整数,余数被舍去,因此test的值为9。


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