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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 21
    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 averti
    Inscrit en
    Février 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 20
    Par défaut
    t'as juste à caster ton nombre en int.

    TonNombre = (int) TonNombre;

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    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 chevronné
    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
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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
    Membre averti
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 21
    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
    Membre averti
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 21
    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 Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    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 confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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.

  10. #10
    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
    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.

  11. #11
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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 Invité 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