当我做这样的事情
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?谢谢。
在您的第二个示例中,尽管您将结果分配给type 的变量float,但计算本身的执行方式仍与第一个示例完全相同。Java 不会查看目标变量类型来确定如何计算右手边。特别是,子表达式3 * (4 - 1) / 2导致4.
要解决此问题,您可以使用浮点文字而不是所有整数:
float test = 5 + 3 * (4 - 1) / 2.0f;
使用2.0f触发算术表达式的浮点计算。
尽管您5 + 3 * (4 - 1) / 2用浮点数表示结果,但实际计算是使用整数精度完成的,这意味着除法9 / 2返回 4 而不是如果将它们作为浮点数计算时您将收到的 4.5。
表达式有自己的类型。所以开始:
5 + 3 * (4 - 1) / 2
每个值都有自己的类型。这种类型恰好是int,所以这与:
((int)5) + ((int)3) * (((int)4) - ((int)1)) / ((int)2)
更清楚地表明我们正在处理整数。只有在对其进行评估后,9才会将其分配给浮点数。
简短的回答是整数类型在模算术上进行运算,模数为 1,并丢弃余数。
由于您将其转换test为整数,因此模数运算采用模数 1(例如 9.5 mod 1),int test = 5 + 3 * (4 - 1) / 2;
对于 32 位或 64 位浮点数,这将给出 9.5;但是,由于您已转换test为int,余数将被丢弃,并且引用的test值为 9。