Question

Hi i want to round double numbers like this (away from zero) in C++:

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

What is the efficient way to do this?

Was it helpful?

Solution

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

As mentioned in the article Huppie cites, this is best expressed as a template that works across all float types

See http://en.cppreference.com/w/cpp/numeric/math/floor and http://en.cppreference.com/w/cpp/numeric/math/floor

or, thanks to Pax, a non-function version:

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

OTHER TIPS

There is a nice article about a similar problem on CPlusPlus.com. The easy solution to your problem should be something like this:

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

A better solution is the one mentioned in the article, which uses a template:

//--------------------------------------------------------------------------
// 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;
}

try

 double rounded = _copysign(ceil(abs(x)), x);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top