2009-08-25 8 views
6

Salut je veux arrondir doubles chiffres comme celui-ci (à l'écart de zéro) en C++:C++ arrondi des nombres loin de zéro

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

Quelle est la façon efficace de le faire?

+1

Du titre (original) « C++ Double arrondi ", je pensais que vous vouliez dire arrondir un nombre deux fois, juste pour être sûr :-) – paxdiablo

+0

vous avez raison: D thx pour l'éditer – Emre

Répondre

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

Comme mentionné dans the article Huppie cites, c'est le mieux exprimé comme un modèle qui fonctionne sur tous les types de flotteur

Voir http://en.cppreference.com/w/cpp/numeric/math/floor et http://en.cppreference.com/w/cpp/numeric/math/floor

ou, grâce à Pax , une version sans fonction:

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

merci ça marche – Emre

+0

Bon appel, @Ruben, a ajouté une variante de non-fonction et vous a donné un vote. J'espère que cela ne vous dérange pas (le montage, évidemment, cela ne vous dérange pas le vote). – paxdiablo

+0

En attente de 3k moi-même - ajouté dans un spécificateur en ligne - j'aurais tendance à essayer de trouver un bon nom et de le coller dans une librairie utilitaire, probablement comme modèle pour tous les flotteurs - cela ne coûterait pas d'efficacité et vous permet isoler ou modifier toutes les utilisations –

-1

essayer

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

Ne fonctionne pas pour les négatifs –

+0

mais ceil renvoie une plus grande valeur entière si ma valeur est -3,4 et j'ajoute 0.5 ce sera -2.9 et ceil reviendrai -2 Je veux quelque chose à faire -4 – Emre

+1

ceil (x + 0.5) fo r x = 5,7 donnerait 7 au lieu de 6, n'est-ce pas? – samuil

2

Il existe un article intéressant sur un problème similaire sur CPlusPlus.com. La solution facile à votre problème devrait être quelque chose comme ceci:

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

Une meilleure solution est celle mentionnée dans l'article, qui utilise un modèle:

//-------------------------------------------------------------------------- 
// 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

isnt il a appelé customFloor - il est ni: P –

+0

Je vois dans l'article cité son impl'd comme template FloatType ceil0(const FloatType& value) { FloatType result = std::ceil(std::fabs(value)); return (value < 0.0) ? -result : result; } article intéressant, +1 –

+0

@Ruben Bartelink: devrait être mieux 'Round':) ... btw .. Vous avez des compétences de frappe ninja ;-) – Huppie