c ++ arredondamento dos números longe de zero
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?
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