Objective C ceil返回错误的值

sat*_*god 18 ios

NSLog(@"CEIL %f",ceil(2/3));
Run Code Online (Sandbox Code Playgroud)

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

CEIL 0.000000
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*mmy 51

与C相同的规则适用:2并且3是整数,因此2/3是整数除.整数除法截断所以2/3产生整数0.该整数0然后将转换为一个双精度浮点数的呼叫ceil,但ceil(0)0.

将代码更改为:

NSLog(@"CEIL %f",ceil(2.0/3.0));
Run Code Online (Sandbox Code Playgroud)

将显示您期望的结果.添加小数点会使常量被识别为双精度浮点数(并且2.0f是您键入单精度浮点数的方式).

Maudicus的解决方案有效,因为(float)2/3将整数2转换为浮点数而C的推广规则意味着它会将分母提升为浮点数,以便将浮点数除以整数,从而得到浮点结果.

因此,您当前的声明ceil([myNSArray count]/3)应更改为:

([myNSArray count] + 2)/3           // no floating point involved
Run Code Online (Sandbox Code Playgroud)

要么:

ceil((float)[myNSArray count]/3)    // arguably more explicit
Run Code Online (Sandbox Code Playgroud)


Jes*_*ack 10

除非将其转换为浮点数,否则2/3的计算结果为0.因此,在您想要之前,必须小心将值转换为int.

float decValue = (float) 2/3;
NSLog(@"CEIL %f",ceil(decValue));
Run Code Online (Sandbox Code Playgroud)

==>

 CEIL 1.000000
Run Code Online (Sandbox Code Playgroud)

对于你的数组示例

float decValue = (float) [myNSArray count]/3;
NSLog(@"CEIL %f",ceil(decValue));
Run Code Online (Sandbox Code Playgroud)