谁能向我解释为什么当它应该返回 42 时它一直返回 0?它在纸上有效,所以我知道数学是正确的我只是想知道为什么它没有翻译过来?
int a = 60;
int b = 120;
int c = 85;
int progress;
progress = ((c-a)/(b-a))*100;
NSLog(@"Progess = %d %%",progress);
谁能向我解释为什么当它应该返回 42 时它一直返回 0?它在纸上有效,所以我知道数学是正确的我只是想知道为什么它没有翻译过来?
int a = 60;
int b = 120;
int c = 85;
int progress;
progress = ((c-a)/(b-a))*100;
NSLog(@"Progess = %d %%",progress);
这是因为您的数学都使用整数。
特别是,您的内部表达式正在计算 25 / 60,在整数数学中为零。
实际上,您对表达式进行了过度括号化,并且由此产生的评估顺序导致整数舍入问题。
如果您刚刚编写公式,它会很好用:
progress = 100 * (c - a) / (b - a);
因为 100 * (c - a) 将首先计算为 2500,然后除以 60 得到 41。
或者,如果您的变量中的任何一个(或多个)a
、b
或c
是float
(或强制转换),则该等式也将起作用。
这是因为其中一个操作数是 a 的表达式也会导致float
另一个(整数)操作数也被提升为 a float
,此时表达式的结果也将是 a float
。
c - a
会给你25
b - a
会给你60
因为a
,b
和c
都是整数,这意味着它们不能是小数。因此,通过这样做(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;
a
,b
并且c
是int
s。当你计算((c-a)/(b-a))
时,结果也是一个int
;实际值是小数(0.42),但int
不能取小数,所以四舍五入为0
,乘以100
得到0
。
因为(c - a) / (b - a)
是使用 计算的integer math
。
要修复,请在除法之前转换为浮点数:
progress = (int)((((float)(c - a)) / ((float)(b - a))) * 100);