当我做类似这样的事情时
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?谢谢。
当我做类似这样的事情时
int test = 5 + 3 * (4 - 1) / 2;
float test = 5 + 3 * (4 - 1) / 2;
float test1 = 5;
float test2 = 4.5;
float test = test1 + test2;
测试最终输出9.5。有人能解释一下背后的逻辑吗?为什么我在第二个例子中没有得到9.5?谢谢。
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
转换为整数,余数被舍去,因此test
的值为9。