我有兴趣在执行以下操作时看到一个奇怪的错误:
int width = 300;
int var1 = width/3;
int var2 = width * 1/3;
int var3 = width * 2/3;
int var4 = width*(1/3);
int var5 = width * (int)(1/3);
int var6 = (int)(width*(1/3));
System.out.println("Var1: " + var1);
System.out.println("Var2: " + var2);
System.out.println("Var3: " + var3);
System.out.println("Var4: " + var4);
System.out.println("Var5: " + var5);
System.out.println("Var6: " + var6);
输出是这样的:
Var1: 100
Var2: 100
Var3: 200
Var4: 0
Var5: 0
Var6: 0
为什么最后三个操作返回0
? 1/3
周围的括号似乎改变了它执行计算的方式,但即使尝试将其置于int
也没有改变输出。
我正在使用BlueJ IDE
和Java version 1.7.0_17
修改
我找到了答案。这是由于操作的顺序。 parens
导致除法首先出现,而int
1/3或2/3将始终等于0
。如果我允许width * 2
在除以3
之前发生一切正常,因为该数字大于1
。
有时它只是基本的数学......:)
答案 0 :(得分:3)
对于第四种情况试试这个,请注意,通过添加一个小数点,我们强制进行十进制除法,而不是像之前那样的整数除法:
int var4 = width*(1/3.0);
对于最后两种情况,请尝试这样做 - 尽管这最终与之前的其他情况相同!
int var5 = width * (1/3);
int var6 = (width*(1/3));
请注意,(int)1/3
为0
,演员正在使分组返回0
,而0
次则会返回任何内容......好吧,0
。如果你离开演员阵容,这两个案件就无法发挥作用。
答案 1 :(得分:1)
这是相关的,所以请参阅Order of Precedence。