J'utilise VS2008 et j'ai inclus math.h mais je ne trouve toujours pas de fonction ronde. Existe-t-il?
Je vois un tas de solutions "ajouter 0.5 et cast to int" sur google. Est-ce la meilleure pratique?
Vous pouvez utiliser C++ 11 std::round()
.
Si vous êtes toujours bloqué 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 supérieur.
Pour obtenir le comportement d'arrondi normal, vous devez en effet utiliser floor(i + 0.5)
.
De cette façon, vous aurez des problèmes avec les nombres négatifs, une solution de contournement pour ce problème consiste à utiliser ceil () pour les nombres négatifs:
double round(double number)
{
return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5);
}
Un autre moyen, plus propre, mais plus gourmand en ressources, consiste à utiliser un train de chaînes 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 manquez de ressources et/ou si vous avez besoin de contrôler la précision.
L'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);
}
Il n'y a en fait pas de fonction ronde dans Microsoft math.h.
Cependant, vous pouvez utiliser la méthode statique Math :: Round () à la place.
(Selon votre type de projet.)
Je ne sais pas si c'est la meilleure pratique ou non mais utiliser la technique 0.5 avec un floor () semble être la voie à suivre.