web-dev-qa-db-fra.com

Où est 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-il?

Je vois un tas de solutions "ajouter 0.5 et cast to int" sur google. Est-ce la meilleure pratique?

38
Jason Punyon

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.

63
Patrick Glandien

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);
}
15
Bill the Lizard

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.)

3
Sani Singh Huttunen

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.

0
Elroy