2015-01-22 5 views
2

Мой вопрос: существует ли функциональная разница между округлением двойного вниз до int через roundedInt = (int)unRoundedDouble и roundedInt = (int)(floor(unRoundedDouble))?C: лучший метод округления двойного к int

Я видел, как последний использовался в коде, и думал, что, возможно, это по соображениям безопасности или по функциональности, но не может понять, что будет обрабатываться по-другому.

Также: округленный двойной не будет слишком большим, чтобы вписаться в int, это определено заранее.

ответ

3

Они принципиально разные. Листинг до int усекает нецелую часть в сторону 0. floor будет делать то же самое, но в направлении, -infinity.

Пример:

double d = -1.234; 
printf("%d %d\n", (int)d, (int)floor(d)); 

Урожайность:

-1 -2 
2

Решение с floor хорошо подходит для отрицательных чисел, версия литья неверна математически - если округлять вниз, вы имеете в виду операцию floor.

Так что #floor всегда работает как математическая операция floor, литье ведет себя одинаково для позитива. Однако литье на негативах ведет себя как операция ceiling.

+0

Не могли бы вы объяснить, как это неправильно, или дать случай, когда это не будет работать? Благодаря! :) (не зря, я просто понял, что он округляет негативы.) – BigBadWolf

+1

@BigBadWolf casting усекает десятичную часть, а 'floor' вычисляет реальный математический пол –

Смежные вопросы