数学方程如何在Java中工作?

时间:2012-08-26 22:40:59

标签: java math operators

当我做这样的事情时

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 个答案:

答案 0 :(得分:17)

在第二个示例中,虽然您结果分配给float类型的变量,但计算本身仍然与第一个示例完全相同。 Java不会查看目标变量类型来确定如何计算右侧。特别是,子表达式3 * (4 - 1) / 2会生成4

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

开始
5 + 3 * (4 - 1) / 2

每个值都有自己的类型。此类型恰好是int,因此与以下内容相同:

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

更清楚地说明我们正在处理整体问题。只有在评估为9之后才会将其分配给浮动。

答案 3 :(得分:0)

简短的回答是整数类型采用模运算,模数为1,并丢弃余数。

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

使用32位或64位浮点数,这将得到9.5;但是,因为您已将test转换为int,所以余数将被丢弃,test引用的值为9。