当我做这样的事情时
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?感谢。
答案 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。