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)
| 归档时间: |
|
| 查看次数: |
17154 次 |
| 最近记录: |