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 :

Extraire la partie décimale d'un nombre


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut Extraire la partie décimale d'un nombre
    Bonjour,


    J'ai une question dont j'imagine la réponse comme assez simple, mais je n'ai pas réussi à la trouver pour l'instant...

    J'ai un double qui contient la valeur 2,3.

    J'ai besoin de récupérer sous forme d'entier (long, int) la partie décimale c'est à dire 3.

    J'ai essayé "bêtement" de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double nbAVirgule = 2.3;
    long partieEntiere = (long)nbAVirgule;
    long partieDecimale = nbAVirgule*10 - partieEntiere*10;
    Et bien, partieDecimale = 2
    Alors que j'ai bien partieEntiere = 2.

    Je me suis dit que c'est ma conversion en long pour obtenir partieDecimale qui était la cause, donc j'ai testé la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    double nbAVirgule = 2.3;
    long partieEntiere = (long)nbAVirgule;
    double tmp = nbAVirgule*10 - partieEntiere*10;
    long partieDecimale = (long)tmp;
    Vous me direz que ça revient au même... mais ce qui est marrant c'est que tmp est bien égal à 3 , partieDecimale restant égale à 2...

    Merci de bien vouloir m'éclairer sur la bonne façon de procéder pour isoler sous forme d'entier la partie décimale d'un nombre...

  2. #2
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    t'as juste à caster ton nombre en int.

    TonNombre = (int) TonNombre;

  3. #3
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par noutnout53
    t'as juste à caster ton nombre en int.

    TonNombre = (int) TonNombre;
    static_cast<int> TonNombre est mieux

    Sinon l'opérateur qui fait ça proprement c'est floor:
    donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int partie_entiere = static_cast<int> (floor (TonNombre) );
    EDIT : je sais pas si le floor est vraiment indispensable !

  4. #4
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    essaie ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double nbAVirgule = 2.3;
    long partieEntiere = (long)nbAVirgule;
    double tmp = nbAVirgule*10.0 - partieEntiere*10;
    long partieDecimale = (long)tmp;
    il y a parfois des conversions de type sauvage lors d'une opération entre un entier et un réel...

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    floor + static_cast, c'est sans doute le mieux.
    En tout cas, les cast à la 'C' ne sont pas à utiliser en C++, on ne sait pas ce qu'ils vont faire pour tous les types de données.

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Euh pour poukill et noutnout, c'est la partie décimale sous forme d'entier que je cherche à avoir... donc c'est sur quel nombre que je fais le static_cast<int> ?

    Peut-être que j'ai mal compris votre réponse, mais il me semble que vous me dites comment obtenir la partie entière...

    Joellel, je vais regarder

    Merci !

  7. #7
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Bon, j'ai essayé la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    double nbAVirgule = 2.3;
    int partieEntiere = static_cast<int>(nbAVirgule);
    double tmp = nbAVirgule*10.0 - partieEntiere*10;
    int partieDecimale = static_cast<int>(tmp);
    Et le problème reste le même, j'obtiens partieDecimale = 2.

    Petite précision mon 2.3 je l'obtiens à partir d'une chaîne de caractère (string) que je convertie en double grâce à un istringstream. Mais mon cout confirme la valeur de 2,3.

    Merci!

  8. #8
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Kant2006
    Bon, j'ai essayé la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double nbAVirgule = 2.3;
    int partieEntiere = static_cast<int>(nbAVirgule);
    double tmp = nbAVirgule*10.0 - partieEntiere*10;
    int partieDecimale = static_cast<int>(tmp);

    Et le problème reste le même, j'obtiens partieDecimale = 2.

    Petite précision mon 2.3 je l'obtiens à partir d'une chaîne de caractère (string) que je convertie en double grâce à un istringstream. Mais mon cout confirme la valeur de 2,3.

    Merci!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double nbAVirgule = 2.3;
    int partieEntiere = static_cast<int>(floor (nbAVirgule ));
    int partieDecimale= static_cast<int>(nbAVirgule*10.0) - partieEntiere*10;
    essaie ça, ça devrait marcher !

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    2.3 n'est pas representable exactement dans la plupart des formats flottants. Donc ta variable contient quelque chose de proche de 2.3, legerement inferieur a voir ton resultat.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Exact. Tu peux rajouter 0.5 au résultat pour voir.

  11. #11
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Alors pour être le plus précis possible, voilà exactement ce que je fais :

    Je crée une string totoString = "2.3"
    Je convertie en double via un istringstream, et j'obtiens donc mon double toto=2.3.
    Je retranche 2 à toto
    Et ensuite je procède comme indiqué au début :
    int partieEntiere = (int)(toto);
    double tmp = toto*10- partieEntiere*10;
    int partieDecimale = (int)tmp;

    Le détail important est le retrait de 2 à toto... car si je ne retranche rien, pas de pb ! J'obtiens bien 3... alors que j'obtiens 2 si je retranche quelque chose .

    Je vais essayer ce que tu dis poukill...

    JM Bourget, comment faire alors ? Car ce n'est pas possible qu'il n'y ait pas de solution , si ?

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    fait une fois un double tmp = [...] + 0.5;
    ou encore mieux, regarde au débuggeur ce qu'il se passe !

  13. #13
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Kant2006
    JM Bourget, comment faire alors ? Car ce n'est pas possible qu'il n'y ait pas de solution , si ?
    C'est quoi ton probleme exactement? Car l'utilisation de 2.3 n'est qu'une instance je suppose.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  14. #14
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Après utilisation du débugger, il semblerait que le problème vienne du

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int tmp = static_cast<int>(toto*10);
    Je précise qu'avant cette ligne toto = 0.30000000000 (obtenu par retrait de la valeur 2 au double toto initialisé via une string et un istringstream à 2.3), et que tmp prend comme valeur 2 après celle-ci... alors que pour moi 0.300000000 * 10 = 3

    ça vous inspire ?

  15. #15
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Mon problème JM, c'est que j'ai une liste de string :

    20.0
    12.2
    25.3
    2.3
    8.0
    12.0

    Et que je veux récupérer le chiffre qui se situe après la virgule (y en a forcément qu'un), sachant qu'avant cela j'ai converti la string en double car je devais la manipuler en double pour d'autres calculs....

    Tu me diras, je peux la stocker en string ET en double dans ma classe, et utiliser une méthode de la classe string pour l'extraction...

    Ou encore peut-être repasser par une string juste à l'endroit qui m'intéresse...

    Hum

    Mais dans l'absolu je trouve ça fou qu'il n'y ait pas de moyen en restant avec des nombres...

  16. #16
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Kant2006
    Mon problème JM, c'est que j'ai une liste de string :

    20.0
    12.2
    25.3
    2.3
    8.0
    12.0

    Et que je veux récupérer le chiffre qui se situe après la virgule (y en a forcément qu'un), sachant qu'avant cela j'ai converti la string en double car je devais la manipuler en double pour d'autres calculs....

    Tu me diras, je peux la stocker en string ET en double dans ma classe, et utiliser une méthode de la classe string pour l'extraction...

    Ou encore peut-être repasser par une string juste à l'endroit qui m'intéresse...

    Hum

    Mais dans l'absolu je trouve ça fou qu'il n'y ait pas de moyen en restant avec des nombres...
    Ok, tu es sur que tes doubles proviennent de la conversion de nombres representes en decimal avec un seul chiffre apres la virgule. Je vais supposer en plus qu'ils sont tous positifs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    long ent = (long) d;
    int dig = (int)(d-ent)*10 + 0.5);
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Miles
    fait une fois un double tmp = [...] + 0.5;
    , ça répond à ce que JM disait en contournant le pb.

    edit : grillé

  18. #18
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Ok je vais essayer ça

    En attendant, j'ai contourné le problème en faisant l'extraction à partir de la string, ça marche évidemment sans problème.

    Merci !

  19. #19
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Citation Envoyé par poukill
    static_cast<int> TonNombre est mieux

    Sinon l'opérateur qui fait ça proprement c'est floor:
    donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int partie_entiere = static_cast<int> (floor (TonNombre) );
    EDIT : je sais pas si le floor est vraiment indispensable !
    Encore mieux : aucun cast, étant donné que ce n'est pas nécessaire.
    Pour les conversions, le mieux est toujours de se baser sur l'implicite, étant donné qu'en étant explicite on peut forcer certaines choses dangereuses.
    Boost ftw

  20. #20
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Sauf qu'il va afficher des warnings et mettre de toute manière le cast. Donc c'est ******, ton commentaire.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/05/2021, 15h33
  2. Extraire la partie décimale d'un nombre
    Par syntaxlb dans le forum Langage
    Réponses: 5
    Dernier message: 28/09/2016, 13h47
  3. Extraire la partie décimale d'un nombre
    Par Najua dans le forum SAS Base
    Réponses: 1
    Dernier message: 22/09/2010, 18h54
  4. Réponses: 3
    Dernier message: 16/05/2007, 21h11
  5. affichage partie décimal d'un nombre
    Par freestyler1982 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 30/10/2006, 12h55

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