1

谁能向我解释为什么当它应该返回 42 时它一直返回 0?它在纸上有效,所以我知道数学是正确的我只是想知道为什么它没有翻译过来?

    int a = 60;
    int b = 120;
    int c = 85;
    int progress;

    progress = ((c-a)/(b-a))*100;

    NSLog(@"Progess = %d %%",progress);
4

4 回答 4

8

这是因为您的数学都使用整数。

特别是,您的内部表达式正在计算 25 / 60,在整数数学中为零。

实际上,您对表达式进行了过度括号化,并且由此产生的评估顺序导致整数舍入问题。

如果您刚刚编写公式,它会很好用:

progress = 100 * (c - a) / (b - a);

因为 100 * (c - a) 将首先计算为 2500,然后除以 60 得到 41。

或者,如果您的变量中的任何一个(或多个)abcfloat(或强制转换),则该等式也将起作用。

这是因为其中一个操作数是 a 的表达式也会导致float另一个(整数)操作数也被提升为 a float,此时表达式的结果也将是 a float

于 2012-04-20T17:13:55.807 回答
3

c - a会给你25

b - a会给你60

因为a,bc都是整数,这意味着它们不能是小数。因此,通过这样做(c-a)/(b-a),您将得到 0,而不是 0.41666666,因为在整数除法中,小数点后的任何内容都将被截断,留下小数点前的数字。

为了让它按照你想要的方式工作,你应该尝试强制转换(c-a)(b-a)加倍或浮动:

progress = ((float)(c-a) / (float)(b-a)) * 100;

或者

progress = ((double)(c-a) / (double)(b-a)) * 100;

于 2012-04-20T17:21:04.290 回答
1

ab并且cints。当你计算((c-a)/(b-a))时,结果也是一个int;实际值是小数(0.42),但int不能取小数,所以四舍五入为0,乘以100得到0

于 2012-04-20T17:13:58.573 回答
1

因为(c - a) / (b - a)是使用 计算的integer math

要修复,请在除法之前转换为浮点数:

progress = (int)((((float)(c - a)) / ((float)(b - a))) * 100);
于 2012-04-20T17:14:14.693 回答