38 votes

Où se trouve Round() en C++ ?

Duplicata de : round() pour float en C++


J'utilise VS2008 et j'ai inclus math.h mais je ne trouve toujours pas de fonction ronde. Existe-t-elle ?

Je vois un tas de solutions "ajouter 0,5 et convertir en int" sur Google. Est-ce la meilleure pratique ?

63voto

Vous pouvez utiliser la méthode C++11 std::round() .

Si vous êtes toujours coincé avec des normes plus anciennes, vous pouvez utiliser std::floor() qui arrondit toujours au nombre inférieur, et std::ceil() qui arrondit toujours au nombre le plus élevé.

Pour obtenir le comportement normal d'arrondi, vous devriez en effet utiliser floor(i + 0.5) .

Cette méthode vous posera des problèmes avec les nombres négatifs, une solution de contournement pour ce problème est d'utiliser ceil() pour les nombres négatifs :

double round(double number)
{
    return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5);
}

Une autre méthode, plus propre mais plus gourmande en ressources, consiste à utiliser un stringstream et les manipulateurs d'entrée/sortie :

#include <iostream>
#include <sstream>

double round(double val, int precision)
{
    std::stringstream s;
    s << std::setprecision(precision) << std::setiosflags(std::ios_base::fixed) << val;
    s >> val;
    return val;
}

N'utilisez la deuxième approche que si vous n'êtes pas à court de ressources et/ou si vous avez besoin de contrôler la précision.

15voto

Bill the Lizard Points 147311

Utilisation de floor(num + 0.5) ne fonctionnera pas pour les nombres négatifs. Dans ce cas, vous devez utiliser ceil(num - 0.5) .

double roundToNearest(double num) {
    return (num > 0.0) ? floor(num + 0.5) : ceil(num - 0.5);
}

3voto

Sani Huttunen Points 10433

En fait, il n'y a pas de fonction ronde dans le fichier math.h de Microsoft.
Cependant, vous pouvez utiliser la méthode statique Math::Round() à la place.
(En fonction de votre type de projet).

0voto

Elroy Points 424

Je ne sais pas si c'est une bonne pratique ou non, mais utiliser la technique du 0,5 avec un floor() semble être la meilleure solution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X