Подтвердить что ты не робот

Цель C ceil возвращает неправильное значение

NSLog(@"CEIL %f",ceil(2/3));

должен вернуться 1. Однако он показывает:

CEIL 0.000000

Почему и как исправить эту проблему? Я использую ceil([myNSArray count]/3), и он возвращает 0, когда количество массивов равно 2.

4b9b3361

Ответ 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

Ответ 2

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

Ответ 3

Вероятно, он оценивает 2 и 3 как целые числа (как они есть, очевидно), оценивает результат (который равен 0), а затем преобразует его в float или double (что также равно 0,00000). Самый простой способ исправить это - ввести либо 2.0f/3, 2/3.0f, либо 2.0f/3.0f (или без "f", если хотите, что бы вы больше не хотели;)).

Надеюсь, что это поможет