В 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 только в том случае, если вы знаете, это то, что вам нужно - и, поскольку вы спрашиваете здесь, есть вероятность, что вы, вероятно, захотите этаж
.
(Также обратите внимание, что с форматированием printf
, % ld
- длинное целое число; двойное значение - % lf
.)
floor (n)
возвращает математический предел n
, то есть наибольшее целое число, не превышающее n
. (int) n
возвращает усечение n
, целого числа, абсолютное значение которого не больше, чем n
. Точно так же ceil (n)
возвращает математический предел n
или наименьшее целое число, не меньшее, чем n
. Как указал Арак, число, возвращаемое floor ()
или ceil ()
, может не соответствовать диапазону int
.
Вы хотите, чтобы результат был целым или двойным?
Если вы хотите целое число, приведите; если вы хотите двойной, используйте этаж
.
Например, если вы хотите получить косинус значения, вы должны просто использовать floor
, поскольку cos
принимает двойное значение.
Но если вы хотите использовать значение для exit
(просто выбирая здесь случайный API), вам следует выполнить приведение, потому что exit
принимает int.
Первый преобразовывает ваше значение с плавающей запятой как целое число (и вы используете спецификатор int в вызове printf).
Последний использует пол (из математической библиотеки C) для возврата числа с двойным округлением в меньшую сторону.
Когда вы получаете этаж
двойного, это "целое" двойное
может быть, а может и не быть представимым в переменной типа int
.