IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[C++] faire un arrondi sur un double


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 19
    Par défaut [C++] faire un arrondi sur un double
    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

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour

    en utilisant une bibliotheque du c, on peut faire :
    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
    ou même -sans include- :
    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

  3. #3
    Membre émérite Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Par défaut
    Ca marche si on fait un cast double???

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par reggae
    Ca marche si on fait un cast double???
    euh ... ? je ne sais pas, à tester... c'est du c++ pur ca ?

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    La notion d'arrondi sur un nombre à virgule flottante est un piège, en informatique. C'est impossible. Exemple :

    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();
    }
    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.

    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.

  6. #6
    Membre émérite Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Par défaut
    Non peut être pas... tu as sans doute raison ce n'est pas très "propre"!

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème d'arrondi sur un Double
    Par Gordon Freeman dans le forum Général Java
    Réponses: 2
    Dernier message: 23/06/2010, 10h35
  2. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  3. Double arrondi sur un dataset
    Par isachat666 dans le forum Bases de données
    Réponses: 7
    Dernier message: 02/06/2006, 13h07
  4. [VB.Net] Faire du JS sur des contrôles côté serveur
    Par TagadaTsoin dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/11/2003, 15h51
  5. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo