Ответ 1
Применяются те же правила, что и C: 2
и 3
являются int, поэтому 2/3
является целым делением. Целочисленное деление усекает так, что 2/3
создает целое число 0
. Это целое число 0
затем будет передано в float с двойной точностью для вызова 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