Pergunta

Oi eu quero números rodada dupla como este (longe de zero) em C ++:

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

O que é a maneira eficiente de fazer isso?

Foi útil?

Solução

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

Conforme mencionado na o artigo Huppie cita , este é melhor expressa como um modelo que funciona em todos os tipos float

http://en.cppreference.com/w/cpp/ numérico / matemática / chão e http: //en.cppreference. com / w / CPP / numérica / matemática / chão

ou, graças a Pax, uma versão não-função:

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

Outras dicas

Há um artigo agradável sobre um problema semelhante no CPlusPlus.com . A solução fácil para o problema deve ser algo como isto:

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

A melhor solução é a mencionada no artigo, que utiliza um modelo:

//--------------------------------------------------------------------------
// 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top