NSLog(@"CEIL %f",ceil(2/3));
应该返回1.但是,它显示:
CEIL 0.000000
为什么以及如何解决这个问题?我使用ceil([myNSArray count]/3)
,当数组计数为2时返回0。
答案 0 :(得分:51)
与C适用的规则相同:2
和3
是整数,因此2/3
是整数除法。整数除法截断,因此2/3
生成整数0
。然后,对于0
的调用,该整数ceil
将被强制转换为双精度浮点数,但ceil(0)
为0
。
将代码更改为:
NSLog(@"CEIL %f",ceil(2.0/3.0));
将显示您期望的结果。添加小数点会导致常量被识别为双精度浮点数(并且2.0f
是您键入单精度浮点数的方式。)
Maudicus'解决方案有效,因为(float)2/3
将整数2
强制转换为浮点数而C的推广规则意味着它会将分母提升为浮点数,以便将浮点数除以整数给出一个浮点结果。
因此,您当前的声明ceil([myNSArray count]/3)
应更改为:
([myNSArray count] + 2)/3 // no floating point involved
或者:
ceil((float)[myNSArray count]/3) // arguably more explicit
答案 1 :(得分:10)
2/3的计算结果为0,除非你将其转换为浮点数。 因此,在您想要之前,您必须小心将值转换为int。
float decValue = (float) 2/3;
NSLog(@"CEIL %f",ceil(decValue));
==>
CEIL 1.000000
对于你的数组示例
float decValue = (float) [myNSArray count]/3;
NSLog(@"CEIL %f",ceil(decValue));
答案 2 :(得分:1)
它可能将2和3计算为整数(显然是它们),计算结果(为0),然后将其转换为float或double(也是0.00000)。解决问题的最简单方法是键入2.0f / 3,2 / 3.0f或2.0f / 3.0f,(如果您愿意,可以不使用“f”,无论您喜欢多少;)。
希望有所帮助