相同的计算,不同的结果?

时间:2015-04-28 07:16:59

标签: java math percentage

我的目标是计算countercap的百分比。 现在我遇到了一个问题,我无法找到下面两个公式之间的差异,就我的数学理解告诉我,它完全相同的计算。但只有第一个起作用,括号没有区别。

int i = counter * 100 / cap; //works
int i = counter / cap * 100; //doesn't work

这与java有什么关系,还是只是我犯了一个可怕的思维错误?

4 个答案:

答案 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中,运算符*和/具有相同的优先级,因此表达式是按顺序计算的。即

  1. counter * 100 / cap - &gt; (柜台* 100)/ cap
  2. counter / cap * 100 - &gt; (柜台/上限)* 100
  3. 所以对于例如counter = 5,cap = 25(期望count和cap都是int变量),评估是在第一种情况下:5 * 100 = 500,然后是500/25 = 20

    在第二种情况下,评估为:5/25 = 0(整数数学!),然后0 * 100 = 0.