Почему round() и ceil() не возвращают целое число?

Время от времени я обнаруживаю, что округляю некоторые числа, и мне всегда приходится приводить результат к целому числу:

int rounded = (int) floor(value);

Почему все функции округления (ceil(), floor()) возвращают число с плавающей запятой, а не целое? Я нахожу это довольно неинтуитивным и хотел бы получить некоторые объяснения!


person Wookai    schedule 10.08.2009    source источник
comment
Вы можете использовать свои навыки поиска и найти это stackoverflow.com/questions/605533/ ИЛИ Это также может быть полезно gnu.org/s/libc/manual/html_node/Rounding-Functions.html   -  person Maksim Vi.    schedule 10.08.2009
comment
Хороший вопрос - никогда бы не подумал его задать   -  person Martin Beckett    schedule 11.08.2009
comment
Этому дубликату удалось получить ответ, который (ИМХО) лучше: целое число"> stackoverflow.com/questions/15348180/   -  person Omnifarious    schedule 12.03.2013


Ответы (2)


Целочисленное значение, возвращаемое этими функциями, может быть слишком большим для хранения в целочисленном типе (int, long и т. д.). Чтобы избежать переполнения, которое приведет к неопределенным результатам, приложение должно выполнять проверку диапазона возвращаемого значения, прежде чем присваивать его целочисленному типу.

со страницы руководства ceil(3) Linux.

person Sean A.O. Harney    schedule 10.08.2009
comment
Спасибо за ответ, я принял ваш, потому что вы были первым ;)! - person Wookai; 10.08.2009

Это потому, что диапазон float шире, чем у int. Что вы ожидаете получить, если значение, возвращаемое этими функциями, не помещается в int? Это было бы неопределенным поведением, и вы не смогли бы проверить это в своей программе.

person sharptooth    schedule 10.08.2009
comment
Не должно быть никакого неопределенного поведения - функции могут быть указаны для возврата значения ошибки в этом случае, точно так же, как это делает strtol(), если число, которое нужно преобразовать, не помещается в длинная. Причина просто в том, что функции были бы гораздо менее полезными, если бы они были ограничены диапазоном значений int. - person caf; 10.08.2009