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 :

Question arrondi


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 29
    Points : 32
    Points
    32
    Par défaut Question arrondi
    Bonjour,

    Je me suis récemment mis au C++ après avoir beaucoup travaillé sur Python.

    J'aimerai savoir s'il existe sur C++ une méthode qui permet d'arrondir un nombre au dixième près (et pas à l'unité) par exemple:
    6,678888 -> 6,7

    Merci à ceux qui prendront le temps de me répondre!

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    6,7 s'écrit en base 2 : 110,1011001100110011001100110011001100110011001100110011...
    Les flottants sont stockés en base 2, ça n'a donc pas de sens de parler d'un nombre et d'un arrondi sur une décimale. On peut par contre avoir une chaîne de caractères représentant le nombre avec un nombre donné de décimales.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::ostringstream  oss;
    oss << std::fixed << std::setprecision(1) << 6.678888;
    std::string  str = oss.str();

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Même en Python, je pense que cette fonction ne fait pas ce que tu veux.

    Voir cet article https://docs.python.org/2/tutorial/floatingpoint.html, notamment autour de la phrase "Other surprises follow from this one. For example, if you try to round the value 2.675 to two decimal places, you get this".

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Mai 2016
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 313
    Points : 1 237
    Points
    1 237
    Par défaut
    Il faut voir quel est le contexte et à quoi sert le programme. Si ce n'est pas du calcul intensif, on peut faire les calculs en BCD, nombres en représentation décimale.
    Dans ce cas, floor(x*10+0.5)/10 est exact et donne bien 6.7, avec la fonction floor() redéfinie sur des nombres BCD.
    Bon exercice de créer une classe représentant un nombre BCD, avec redéfinition des opérations arithmétiques.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 29
    Points : 32
    Points
    32
    Par défaut
    Bonjour, merci pour vos réponses.

    @Bktero, la fonction fait ce que je veux en Python, voici un rapide capture d'écran de l'interpréteur: round(6.7779,1) ou le premier argument est le nombre à arrondir et le second argument est à la quantième décimale je désires arrondir mon nombre (et le cas ou vous m'avez redirigé est aussi bon 2,675 -> 2.67 pour moi bien qu'on aurait pu encore arrondir, j'en suis conscient)




    Merci encore pour vos réponses

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ce genre de chose a évolué entre Python 2.7 et Python 3.3 il me semble.
    Le message, que tu sembles avoir survolé, est qu'un float n'a pas X chiffres significatifs, la machine traite tout en binaire.
    2.7 peut très bien ne pas avoir de représentation en binaire, et ce que tu as en Python c'est juste une représentation textuelle arrondie d'un float qui ne ressemble probablement en rien à cette valeur.
    Et pour représenter ça, dalfab a donné la solution. Et Python te ment et cache énormément de choses.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Speakers Voir le message
    @Bktero, la fonction fait ce que je veux en Python, voici un rapide capture d'écran de l'interpréteur
    Toi, tu n'as pas suivi mon lien

    Essaye de code :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def round_and_print(f, places):
        print("{0:} --> {1:.53f}".format(f, f))
        fa = round(f, places)   
        print("{0:} --> {1:.53f}".format(fa, fa))
     
    round_and_print(6.779, 1)
    round_and_print(6.779, 2)
    round_and_print(2.675, 1)
    round_and_print(2.675, 2)

    Il affiche des flottants avec beaucoup de chiffres après la virgule pour voir vraiment ce qu'il y a dedans.

    Voici le résultat :
    6.779 --> 6.77899999999999991473487170878797769546508789062500000
    6.8 --> 6.79999999999999982236431605997495353221893310546875000
    6.779 --> 6.77899999999999991473487170878797769546508789062500000
    6.78 --> 6.78000000000000024868995751603506505489349365234375000
    2.675 --> 2.67499999999999982236431605997495353221893310546875000
    2.7 --> 2.70000000000000017763568394002504646778106689453125000
    2.675 --> 2.67499999999999982236431605997495353221893310546875000
    2.67 --> 2.66999999999999992894572642398998141288757324218750000
    Si tu remplaces 53 par 15 dans le formatage, tu obtiens ceci :
    6.779 --> 6.779000000000000
    6.8 --> 6.800000000000000
    6.779 --> 6.779000000000000
    6.78 --> 6.780000000000000
    2.675 --> 2.675000000000000
    2.7 --> 2.700000000000000
    2.675 --> 2.675000000000000
    2.67 --> 2.670000000000000
    Tout ceci n'est que de l'affichage. Il faut se méfier de l'affichage. Mais mon lien t'explique tout ça en détails

  8. #8
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par Speakers Voir le message
    Bonjour,

    Je me suis récemment mis au C++ après avoir beaucoup travaillé sur Python.

    J'aimerai savoir s'il existe sur C++ une méthode qui permet d'arrondir un nombre au dixième près (et pas à l'unité) par exemple:
    6,678888 -> 6,7

    Merci à ceux qui prendront le temps de me répondre!
    Bonjour,

    pour revenir au problème de base et tenter d'y répondre, il est important que vous sachiez répondre à cette question :

    Souhaitez-vous afficher une valeur arrondie de votre valeur (tapez 1), ou souhaitez-vous arrondir votre valeur pour effectuer des traitements ultérieurs avec (tapez 2)?

    1. Afficher une valeur arrondie.
    Il existe plusieurs solutions, notamment :
    1.1 <iomanip> et notamment std::setprecision.
    1.2 BOOST.FORMAT

    2. Arrondir une valeur.
    KISS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <cmath>
    #include <cassert>
     
    template<class Float>
    Float round(Float value, unsigned decimal_places, unsigned radix)
    {
        assert(radix > 1);
        Float geometrical_shift = std::pow(radix, decimal_places);
        return std::round(geometrical_shift * value) / geometrical_shift;
    }
    round(v, n, 10) retourne un floatant proche du nombre réel v arrondi à 10^-n près. Mais il n'est pas garanti que ce résultat soit le floatant le plus proche. Programme exemple : http://coliru.stacked-crooked.com/a/aaaa602552476a95
    -- Yankel Scialom

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

Discussions similaires

  1. Question d'arrondi aux centaines
    Par rippoz dans le forum WinDev
    Réponses: 2
    Dernier message: 04/06/2008, 17h31
  2. Question sur arrondis
    Par amel123456789 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/01/2008, 21h07
  3. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11
  4. Question de faisabilité
    Par lisarasu dans le forum CORBA
    Réponses: 3
    Dernier message: 14/05/2002, 11h26
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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