2009-08-25 1 views
6

Привет я хочу, чтобы закруглить двойные номера, как это (от нуля) в C++:C++ округления чисел от нуля

4.2 ----> 5 
    5.7 ----> 6 
-7.8 ----> -8 
-34.2 ----> -35 

Что такое эффективный способ сделать это?

+1

Из (оригинал) названием «C++ Double округление ", я думал, что вы хотели округлить номер дважды, просто чтобы быть уверенным :-) – paxdiablo

+0

Вы правы: D thx для его редактирования – Emre

ответ

25
inline double myround(double x) 
{ 
    return x < 0 ? floor(x) : ceil(x); 
} 

Как уже упоминалось в the article Huppie cites, это лучше всего выражается в виде шаблона, который работает во всех типах флоат

См http://en.cppreference.com/w/cpp/numeric/math/floor и http://en.cppreference.com/w/cpp/numeric/math/floor

или, благодаря Pax , нефункциональная версия:

x = (x < 0) ? floor(x) : ceil(x); 
+0

спасибо, что это работает – Emre

+0

Хороший звонок, @Ruben, добавил не функциональный вариант и дал вам право голоса. Надеюсь, вы не против (редактирование, то есть, очевидно, вы не против голосования). – paxdiablo

+0

Ожидание 3k себя - добавлено в встроенный спецификатор - я бы попытался найти хорошее имя и вставить его в lib, вероятно, в качестве шаблона для всех поплавков - он не стоил бы никакой эффективности и позволял вам быстро изолировать или изменить все его применения –

-1

попробовать

double rounded = _copysign(ceil(abs(x)), x); 
+0

Не работает для отрицательных –

+0

, но ceil возвращает большее целочисленное значение, если мое значение равно -3.4 и я добавлю 0.5, это будет -2.9, а ceil вернет -2. Я хочу что-то сделать. -4 – Emre

+1

ceil (x + 0.5) fo r x = 5.7 даст 7 вместо 6, не так ли? – samuil

2

Существует хорошая статья о аналогичной проблеме на CPlusPlus.com. Простое решение вашей проблемы должно быть что-то вроде этого:

double customRound(double value) const { 
    return value < 0 ? floor(value) : ceil(value); 
} 

Лучшим решением является один упомянутый в статье, которая использует шаблон:

//-------------------------------------------------------------------------- 
// symmetric round up 
// Bias: away from zero 
template <typename FloatType> 
FloatType ceil0(const FloatType& value) 
{ 
    FloatType result = std::ceil(std::fabs(value)); 
    return (value < 0.0) ? -result : result; 
} 
+1

Почему разве это называется customFloor - это ни: P –

+0

Я вижу в цитируемой статье его impl'd, как template FloatType ceil0(const FloatType& value) { FloatType result = std::ceil(std::fabs(value)); return (value < 0.0) ? -result : result; } Интересная статья, +1 –

+0

@Ruben Bartelink: «Круглый» должен быть лучше:) ... кстати .. у вас есть некоторые навыки ввода ниндзя ;-) – Huppie