为什么这个算术运算在java中不起作用?

时间:2013-06-18 02:28:34

标签: java integer-arithmetic

我有兴趣在执行以下操作时看到一个奇怪的错误:

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

为什么最后三个操作返回01/3周围的括号似乎改变了它执行计算的方式,但即使尝试将其置于int也没有改变输出。

我正在使用BlueJ IDEJava version 1.7.0_17


修改

我找到了答案。这是由于操作的顺序。 parens导致除法首先出现,而int 1/3或2/3将始终等于0。如果我允许width * 2在除以3之前发生一切正常,因为该数字大于1

有时它只是基本的数学......:)

2 个答案:

答案 0 :(得分:3)

对于第四种情况试试这个,请注意,通过添加一个小数点,我们强制进行十进制除法,而不是像之前那样的整数除法:

int var4 = width*(1/3.0);

对于最后两种情况,请尝试这样做 - 尽管这最终与之前的其他情况相同!

int var5 = width * (1/3);
int var6 = (width*(1/3));

请注意,(int)1/30,演员正在使分组返回0,而0次则会返回任何内容......好吧,0 。如果你离开演员阵容,这两个案件就无法发挥作用。

答案 1 :(得分:1)

这是相关的,所以请参阅Order of Precedence