Objective C ceil返回错误的值

时间:2011-11-17 23:07:57

标签: ios

NSLog(@"CEIL %f",ceil(2/3));

应该返回1.但是,它显示:

CEIL 0.000000

为什么以及如何解决这个问题?我使用ceil([myNSArray count]/3),当数组计数为2时返回0。

3 个答案:

答案 0 :(得分:51)

与C适用的规则相同:23是整数,因此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”,无论您喜欢多少;)。

希望有所帮助