В C, в чем разница между этими двумя?
float myF = 5.6;
printf( "%i \n", (int)myF ); // gives me "5"
printf( "%ld \n", floor(myF) ); // also "5"?
Когда предпочтительнее другого?
В C, в чем разница между этими двумя?
float myF = 5.6;
printf( "%i \n", (int)myF ); // gives me "5"
printf( "%ld \n", floor(myF) ); // also "5"?
Когда предпочтительнее другого?
Одно большое отличие от отрицательных чисел; если вы измените myF
на -5.6
, то приведение к int возвращает -5
, а floor(myF)
- -6
.
Что касается предпочтительности, то, как правило, я бы сказал, что только бросать в int, если вы знаете, что вам нужно - и, поскольку вы спрашиваете здесь, скорее всего, вы, вероятно, захотите floor
.
(Также обратите внимание, что при форматировании printf
%ld
- длинное целое число, double - %lf
.)
floor(n)
возвращает математический пол n
, то есть наибольшее целое число, не большее n
. (int)n
возвращает усечение n
, целое число, абсолютное значение которого не больше, чем значение n
. Аналогично, ceil(n)
возвращает математический потолок n
или наименьшее целое число, не меньшее n
. Как указывал AraK, число, возвращаемое floor()
или ceil()
, может не соответствовать диапазону int
.
Когда вы получаете двойное значение floor
, это "целое число" double
может или не может быть представлено в переменной типа int
.
Вы хотите, чтобы результат был целым или двойным?
Если вы хотите целое число, cast; если вы хотите использовать double, используйте floor
.
Например, если вы хотите получить косинус значения, вы должны просто использовать floor
, поскольку cos
принимает двойной.
Но если вы хотите использовать значение для exit
(просто выберите случайный API здесь), вы должны использовать, потому что exit
принимает int.
Бывший отбрасывает ваше значение float как целое число (и вы используете спецификатор int в вызове printf).
Последний использует пол (из C math lib), чтобы вернуть двойное округление.