谁能向我解释为什么当它应该返回 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是ints。当你计算((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);