Округление положительного или отрицательного числа

Мне нужно округлить число, но я не знаю, отрицательное это число или положительное.

Есть ли лучший способ округлить foo, чтобы сделать это:

static_cast<int>(foo > 0 ? foo + 0.5 : foo - 0.5)

В основном я хочу такого поведения:

3.4 => 3
3.5 => 4
-3.4 => -3
-3.5 => -4


person Jonathan Mee    schedule 01.07.2015    source источник


Ответы (3)


Для C++ есть один: std::lround

person marom    schedule 01.07.2015
comment
Я знаю, что это расширяет вопрос, но есть ли способ сделать это до С++ 11? - person Jonathan Mee; 01.07.2015
comment
Я принимаю этот ответ, однако хотел бы отметить, что ответ Гленна Тейтебаума является хорошим решением, если вы этого не сделаете. иметь доступ к C++11 или более, просто выполните static_cast<int>(foo + 0.5 - (foo < 0.0)). - person Jonathan Mee; 02.07.2015

Возвращаясь к трюкам старой школы C, которые рассчитывают на преобразование bool в 1, если true, и в 0, если false:

 static_cast <int>(foo + 0.5 - (foo < 0.0))

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

person Glenn Teitelbaum    schedule 01.07.2015
comment
Мне нравится идея использования условия, но не ветвления по нему. Но я думаю, что мы можем добиться большего успеха, чем ваше решение: stackoverflow.com/questions/31162992/ - person Jonathan Mee; 02.07.2015
comment
@JonathanMee Не возражаете, если я обновлю решение, чтобы показать вашу упрощенную математику? - person Glenn Teitelbaum; 02.07.2015
comment
Нет, звучит отлично. Было бы хорошо иметь упрощенную математику в качестве решения. - person Jonathan Mee; 02.07.2015

В математической библиотеке C есть,

double round  (double x);

или есть,

double nearbyint  (double x);
person HarryQuake    schedule 01.07.2015
comment
Это хорошие варианты, но они по-прежнему требуют от меня static_cast. lround также помещает значение в целочисленный формат. - person Jonathan Mee; 01.07.2015
comment
Помимо round (двойной), есть также roundf (плавающий) и roundl (длинный двойной). - person leetNightshade; 23.01.2018