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?谢谢。

4

4 回答 4

17

在您的第二个示例中,尽管您将结果分配给type 的变量float,但计算本身的执行方式仍与第一个示例完全相同。Java 不会查看目标变量类型来确定如何计算右手边。特别是,子表达式3 * (4 - 1) / 2导致4.

要解决此问题,您可以使用浮点文字而不是所有整数:

float test = 5 + 3 * (4 - 1) / 2.0f;

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

于 2012-08-26T22:43:06.340 回答
3

尽管您5 + 3 * (4 - 1) / 2用浮点数表示结果,但实际计算是使用整数精度完成的,这意味着除法9 / 2返回 4 而不是如果将它们作为浮点数计算时您将收到的 4.5。

于 2012-08-26T22:44:46.623 回答
2

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

5 + 3 * (4 - 1) / 2

每个值都有自己的类型。这种类型恰好是int,所以这与:

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

更清楚地表明我们正在处理整数。只有在对其进行评估后,9才会将其分配给浮点数。

于 2012-08-26T23:20:50.420 回答
0

简短的回答是整数类型在模算术上进行运算,模数为 1,并丢弃余数。

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

对于 32 位或 64 位浮点数,这将给出 9.5;但是,由于您已转换testint,余数将被丢弃,并且引用的test值为 9。

于 2012-09-02T01:21:58.420 回答