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

Python Discussion :

convertion de nombre str en int ou float.. assez bizarre..


Sujet :

Python

  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut convertion de nombre str en int ou float.. assez bizarre..
    Bonjour,

    Je suis débutant dans le domaine et j'ai une petite question concernant la conversion..

    Je récupère des nombres dans un fichier texte et donc bien sur je les récupère en str mais j'aimerais me les convertir en entier ou float.

    J'ai donc fait des :
    ou
    en fonction de ce que je veux.

    Ce que j'observe de bizarre, c'est pour les float.

    Je récupère 0.33 dans mon fichier texte et il me l'a transformé en 0.33000000000000002
    et 0.2 en 0.20000000000000001

    Par contre, pas de problèmes pour 0.5 ou 1.2 par exemple...

    Comment ca se fait ? Qu'est-ce qui se passe ?
    Est-ce normale ?

    Merci
    Bonne soirée

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    C'est un problème de représentation interne des float. Ils sont codés en base 2 donc ce qui "tombe juste" en décimal ne tombera peut-être pas "juste" en binaire, on perd très légèrement en précision, si tu veux afficher, il y a des parades pour ça
    http://wikipython.flibuste.net/moin.py/CalculerJuste

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut
    D'accord, j'ai lu cette page, j'ai donc ajouté le bout de code qu'ils préconisaient de mettre mais mon problème reste identique.

    La différence c'est que le résultat de mon réel ne vient pas d'un calcul mais est récupéré dans un fichier texte et est transformé en réel avec la fonction float().

    Quelqu'un a une solution svp ?

    Merci
    Bonne journée

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Regarde du côté du module Decimal, qui échappe au problème que tu rencontres, parce qu'il utilise un codage différent en mêmoire.

    Tyrtamos

  5. #5
    Membre expérimenté Avatar de Gaillac
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut
    J'en vois une pas super élégante, il y a surement mieux, d'autant plus que celle là impose que tu connaisse ton nombre max de décimales.

    Tu fais ton float(), tu décale à gauche de 3 (par exemple) tu arrondi puis tu redécalle à gauche.

    --------------------------
    Après tests rapides, ça marche.
    sauf que comme je n'ai pas eu la force de chercher comment on faisait les décalages, j'ai multiplié et divisé par des puissances de 2 (1024 en l'occurence) ce qui devrait revenir au même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    f_var = float(str_var)
    f_var = fvar * 1024
    f_var = round(f_var)
    f_var = fvar / 1024
    amélioré ça fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def Epurer(self, str_Input, int_Puissance=10)
        f_Output = float(str_var)
        f_Output = f_Output * pow(2,int_Puissance)
        f_Output = round(f_Output )
        f_Output = f_Output / pow(2,int_Puissance)
     
    return f_Output
    reste qu'il y a sans doute
    1° plus beau
    2° déjà tout fait

  6. #6
    Membre expérimenté Avatar de Gaillac
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Regarde du côté du module Decimal, qui échappe au problème que tu rencontres, parce qu'il utilise un codage différent en mêmoire.

    Tyrtamos

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    import decimal
    f_Entree = float(str_Entree )
    decimal.getcontext().prec = 2 
    f_Entree = decimal.Decimal(f_Entree)
    ça à l'air mieux!!
    pareil, tu en fait une fonction avec comme paramètre facultatif ta précision, et tu l'utiise à la place du float() et ça roule:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def Ton_Float(self,str_Entree,int_Precision=3)
        import decimal
        f_Entree = float(str_Entree)
        decimal.getcontext().prec = int_Precision
     
        f_Entree = decimal.Decimal(f_Entree)
     
        return f_Entree

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Quel est le problème exactement ?
    1. Le flottant est affiché avec trop de précision dans l'interpréteur ?
    2. La précision réelle du flottant n'est pas suffisante ?

    Si c'est le deuxième cas, la solution dépend du domaine d'application; si ces nombres représentent de l'argent, par exemple, le type Decimal est sans doute approprié. S'il s'agit de fractions, il vaudrait mieux utiliser l'une ou l'autre libraire de nombres rationnels (je ne pense pas qu'il y en ait dans la librairie standard).

  8. #8
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut
    Mais en fait c'est juste à l'affichage apparemment non ?
    Parce que lorsque j'ai fait des calculs avec ces valeurs, ca n'a pas l'air de prendre en compte que 0.33 est égale a 0.33000000000000002 donc s'il n'y a pas de problèmes dans les calculs, ca me va de laisser comme ca...

    J'ai essayé avec le module Decimal, mais le probleme après c'est qu'on ne peut pas ajouter des réel du coup... il faut tout transformer en Decimal..

    Merci de vos réponses
    ++

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

Discussions similaires

  1. Pb d'un calcul contenant str et int
    Par eyquem dans le forum Général Python
    Réponses: 2
    Dernier message: 05/12/2007, 09h50
  2. Réponses: 4
    Dernier message: 03/10/2006, 23h16
  3. conversion int to float ->resultat erroné
    Par firejocker dans le forum MFC
    Réponses: 5
    Dernier message: 03/04/2006, 14h41
  4. [C#] convertir un nombre hexa en int
    Par linux dans le forum C#
    Réponses: 5
    Dernier message: 08/12/2005, 16h38

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