2011-11-17 64 views
17
NSLog(@"CEIL %f",ceil(2/3)); 

应该返回1。然而,它表明:目标C小区返回错误值

CEIL 0.000000 

为什么,以及如何解决这个问题?我使用ceil([myNSArray count]/3),并且在阵列数为2时返回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

不是'2/3.0'工作吗? –

+0

是的。或'2.0/3'。类型促销朝着浮点格式运行。 – Tommy

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)); 
1

它可能评估2和3的整数(因为它们是,很明显),评估结果(它是0),然后将其转换为float或double(也是0.00000)。修复它的最简单的方法是输入2.0f/3,2/3.0f或2.0f/3.0f,(或者如果你愿意,不需要“f”,无论你喜欢什么);)。

希望它有帮助