我的目标是计算counter
中cap
的百分比。
现在我遇到了一个问题,我无法找到下面两个公式之间的差异,就我的数学理解告诉我,它完全相同的计算。但只有第一个起作用,括号没有区别。
int i = counter * 100 / cap; //works
int i = counter / cap * 100; //doesn't work
这与java有什么关系,还是只是我犯了一个可怕的思维错误?
答案 0 :(得分:2)
这是不一样的计算,因为你正在处理整数算术,它对所有数字都没有Multiplicative inverse number(只有1有它)。
在整数算术中,例如,1/2 == 0
,而不是0.5
- 因为它是实数的算术。这当然会导致以后在乘法时出现不一致。
正如已经提到的 - 这是因为整数算术不像实数算术那样,特别是除法运算符没有被定义为a/b == a*b^-1
,因为b^-1
不是甚至在整数算术中定义为除1之外的所有数字。
答案 1 :(得分:1)
你的错误是假设这些只是纯粹的抽象数字。我假设<div class="form-group">
<label class="col-sm-2 col-sm-2 control-label">Pricing</label>
<div class="col-sm-10">
<select class="form-control" name="pricing">
<option>Please Select</option>
<option value="1">Value 1</option>
<option value="2">Value 2</option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 col-sm-2 control-label">Our Text Input</label>
<div class="col-sm-10">
<input type="text" name="pricing" class="form-control">
</div>
</div>
是counter
...所以第二个版本被评估为:
int
现在我们在这里处理整数算术 - 所以如果int tmp = counter / cap;
int i = tmp * 100;
在[-99,99]范围内,counter
将为0。 / p>
请注意,即使您的第一个版本也可能无效 - 如果tmp
非常大,将其乘以100可能会超出counter
的范围,从而导致否定结果。不过,如果预计int
处于更合理的范围内,这可能是您最好的方法。
即使使用浮点运算,您仍然无法获得“纯”数字的行为 - 当然,在范围和精度方面仍存在限制。
答案 2 :(得分:1)
第一种情况
int i = counter * 100 / cap;
评估为
(counter * 100) / cap;
第二种情况
int i = counter / cap * 100;
像这样被曝光
(counter / cap) * 100
因此有不同的结果
答案 3 :(得分:0)
在Java中,运算符*和/具有相同的优先级,因此表达式是按顺序计算的。即
所以对于例如counter = 5,cap = 25(期望count和cap都是int变量),评估是在第一种情况下:5 * 100 = 500,然后是500/25 = 20
在第二种情况下,评估为:5/25 = 0(整数数学!),然后0 * 100 = 0.