Domanda

Ciao io voglio arrotondare numeri doppi in questo modo (da zero) in C ++:

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

Qual è il modo efficace per fare questo?

È stato utile?

Soluzione

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

Come accennato in l'articolo Huppie cita , questo si esprime al meglio come modello che funziona per tutti i tipi float

http://en.cppreference.com/w/cpp/ numerico / math / piano e http: //en.cppreference. com / w / cpp / numerico / math / piano

o, grazie a Pax, una versione non-funzione:

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

Altri suggerimenti

C'è un bel articolo su un problema simile sul CPlusPlus.com . La soluzione più semplice al problema dovrebbe essere qualcosa di simile:

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

Una soluzione migliore è quello citato in questo articolo, che utilizza un 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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top