Pregunta

Hola quiero redondear los números dobles como este (lejos de cero) en C ++:

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

¿Cuál es la forma eficiente de hacer esto?

¿Fue útil?

Solución

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

Como se mencionó en del artículo Huppie cita , esto se expresa mejor como una plantilla que trabaja en todos los tipos de flotación

http://en.cppreference.com/w/cpp/ numérica / matemáticas / piso y http: //en.cppreference. com / w / CPP / numérico / matemáticas / piso

o, gracias a Pax, una versión no-función:

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

Otros consejos

Hay un buen artículo acerca de un problema similar en CPlusPlus.com . La solución fácil a su problema debe ser algo como esto:

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

Una solución mejor es el que se menciona en el artículo, que utiliza una plantilla:

//--------------------------------------------------------------------------
// 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top