NSLog(@"CEIL %f",ceil(2/3));
должен вернуться 1. Однако он показывает:
CEIL 0.000000
Почему и как исправить эту проблему? Я использую ceil([myNSArray count]/3)
, и он возвращает 0, когда количество массивов равно 2.
NSLog(@"CEIL %f",ceil(2/3));
должен вернуться 1. Однако он показывает:
CEIL 0.000000
Почему и как исправить эту проблему? Я использую ceil([myNSArray count]/3)
, и он возвращает 0, когда количество массивов равно 2.
Применяются те же правила, что и 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
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 и 3 как целые числа (как они есть, очевидно), оценивает результат (который равен 0), а затем преобразует его в float или double (что также равно 0,00000). Самый простой способ исправить это - ввести либо 2.0f/3, 2/3.0f, либо 2.0f/3.0f (или без "f", если хотите, что бы вы больше не хотели;)).
Надеюсь, что это поможет