Salut,
je cherche a faire un arrondi sur un double en pur C++
un peu comme en dot.net
17,987 = Math.round(17,987654, 3 )
si quelqu'un a une idée
merci
Salut,
je cherche a faire un arrondi sur un double en pur C++
un peu comme en dot.net
17,987 = Math.round(17,987654, 3 )
si quelqu'un a une idée
merci
Bonjour
en utilisant une bibliotheque du c, on peut faire :
ou même -sans include- :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #include <cmath> ... double y,x y = floor(x) //167.1860 -> 167 y = (1./100.) * floor(x * 100.) //167.1860 -> 167.18
double x,y
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 y = (int)x //167.1860 -> 167 y = (1./100.) * ((int)(x * 100.)) //167.1860 -> 167.18
Attention, les méthodes données ne renverront que l'arrondi par valeur inférieure.
mabu
euh ... ? je ne sais pas, à tester... c'est du c++ pur ca ?Envoyé par reggae
La notion d'arrondi sur un nombre à virgule flottante est un piège, en informatique. C'est impossible. Exemple :
Sur mon compilo, la première ligne peut faire croire qu'on a arrondi (elle affiche 0.1), mais la deuxième montre qu'il n'en est rien (elle affiche 0.10000000000000001). Un nombre tel que 0.1 (et plein d'autres) ne peut pas exister sous forme de nombre à virgule flottante codé en base 2.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #include <iostream> #include <iomanip> using namespace std; int main() { double exemple = 0.123456789; double arrondi = (1./10.) * ((int)(exemple * 10.)) ; cout << arrondi << endl; cout << setprecision(20) << arrondi << endl; cin.ignore(); }
La question est maintenant pourquoi tu veux arrondir. Si c'est pour gérer l'affichage, je te conseilles de te tourner vers les manipulateurs du flux, afin de choisir te mise en forme.
Si c'est pour faire des calculs (comme du monétaire), alors float ou double ne sont pas des types adaptés. Il te faut créer tes propres types monétaires qui respectent les règles d'arrondi définies dans la loi du pays où tu veux utiliser ton code.
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Non peut être pas... tu as sans doute raison ce n'est pas très "propre"!
Pour faire des calculs monétaires précis, les calculs à virgule flottante sont déconseillés en effet...
Mieux vaut utiliser des nombres à virgule fixe, des nombres directement exprimés en centimes ou bien séparer carrément la partie entière et la partie décimale...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Partager