c ++ округление чисел от нуля - PullRequest
6 голосов
/ 25 августа 2009

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

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

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

Ответы [ 3 ]

25 голосов
/ 25 августа 2009
inline double myround(double x)
{
  return x < 0 ? floor(x) : ceil(x);
}

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

См. 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);
2 голосов
/ 25 августа 2009

Есть хорошая статья о подобной проблеме на 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;
}
0 голосов
/ 25 августа 2009

1001 * попробовать *

 double rounded = _copysign(ceil(abs(x)), x);
...