2009-08-25 19 views
6

Ciao io voglio arrotondare numeri doppi in questo modo (da zero) in C++:C++ arrotondamento dei numeri di distanza dallo zero

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

Qual è il modo efficace per fare questo?

+1

Dalla (originale) titolo di "C++ doppio arrotondamento", ho pensato che significava l'arrotondamento di un numero due volte, giusto per essere sicuri :-) – paxdiablo

+0

hai ragione: D thx per la redazione si – Emre

risposta

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

Come accennato in the article Huppie cites, questo si esprime al meglio come un modello che funziona su tutti i tipi float

Vedi http://en.cppreference.com/w/cpp/numeric/math/floor e http://en.cppreference.com/w/cpp/numeric/math/floor

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

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

grazie funziona – Emre

+0

Buona chiamata, @Ruben, aggiunta una variante senza funzione e ti ha dato un voto. Spero non ti dispiaccia (la modifica, ovviamente, non ti dispiace il voto). – paxdiablo

+0

In attesa di 3k me stesso - ha aggiunto in uno specificatore inline - mi piacerebbe tendo a cercare di trovare un buon nome e incollarla in un lib util, probabilmente come modello per tutti i carri - andrei costato qualsiasi efficienza e di permette rapidamente isolare o modificare tutti gli usi di esso –

-1

provare

double rounded = _copysign(ceil(abs(x)), x); 
+0

non funziona per quelli negativi –

+0

ma Ceil restituisce più grande valore intero se il mio valore è -3,4 e aggiungo 0.5 sarà -2.9 e ceil restituirà -2 voglio qualcosa da fare -4 – Emre

+1

ceil (x + 0.5) per r x = 5,7 restituirebbe 7 invece di 6, no? – samuil

2

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 modello:

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

Perché isnt si chiama customFloor - Non è né: P –

+0

vedo nell'articolo citato la sua impl'd come template FloatType ceil0(const FloatType& value) { FloatType result = std::ceil(std::fabs(value)); return (value < 0.0) ? -result : result; } Interessante articolo, +1 –

+0

@Ruben Bartelink: 'Round' dovrebbe essere migliore:) ... btw .. . si dispone di alcune abilità di battitura ninja ;-) – Huppie

Problemi correlati