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 :

Précision méthode atof()


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 58
    Points : 36
    Points
    36
    Par défaut Précision méthode atof()
    Bonsoir,
    sous Windows XP, Python 2.5, j'importe un fichier data.csv via csv reader.
    Je veux convertir les string contenus dans le .csv en format numérique.
    Par ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i in range(1,nb_lg):
            for j in range(0,nb_col):
                    item=data[i][j]
                    if item is not '':
                        item=item.replace(',','.')
                        data[i][j]=string.atof(item)
    Mais pour certaines valeurs, par ex. item='0,95', ça me le transforme en item=0.95000000001 ou item=0.94999999999 !
    Manque de Précision ?
    Comment toujours obtenir item=0.95 ?

    Merci pour vos réponses !

  2. #2
    Membre éprouvé

    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
    Points : 923
    Points
    923
    Par défaut
    1. Au lieu d'utiliser string.atof (qui est d'ailleurs déconseillé), tu peux et devrais utiliser float.
    2. Ce n'est pas un manque de précision, c'est dû à la différence de représentation. Dans ton fichier CSV, tes valeurs sont stockées en décimal, alors que l'ordinateur les stocke en binaire (de la forme m * 2**e). D'où un léger décalage dans la représentation. En utilisant print ou str, entre autres, Python t'affichera bien 0.95 par exemple. Si tu veux malgré ça garder une représentation décimale conforme à tes attentes, tu peux utiliser decimal

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 58
    Points : 36
    Points
    36
    Par défaut
    Ok, merci :
    >>> a='0.95'
    >>> a
    '0.95'
    >>> print '0.95'
    0.95
    d'accord, et peut-on donner à a la valeur effective 0.95
    pour avoir :
    >>> a
    0.95
    ?
    Question simpliste, désolé.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Tu peux utiliser une chaine de format:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    a=0.95
    print "%g" % a
    0.95
    Pour afficher les flottants, on a plusieurs solutions qui permettent de maitriser le format d'affichage. Par exemple, si on utilise 'f' au lieu de 'g', on peut fixer le nb de chiffres après la virgule (alors que 'g' supprime les zéros inutiles):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    a=0.95
    print "%.5f" % a
    0.95000
    Pour en connaitre plus: http://docs.python.org/library/stdty...ing-formatting

    Tyrtamos

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour

    Citation Envoyé par mister2502 Voir le message
    d'accord, et peut-on donner à a la valeur effective 0.95
    pour avoir :
    >>> a
    0.95
    ?
    Question simpliste, désolé.
    en faisant comme oiffrig a dit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> a="0.95"
    >>> a
    '0.95'
    >>> a=float(a)
    >>> a
    0.94999999999999996
    et si l'affichage ne te convient pas, voir le formatage de chaine proposé par tyrtamos

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 58
    Points : 36
    Points
    36
    Par défaut
    Merci de vos conseils!
    De quoi avancer pour l'instant.
    A +

Discussions similaires

  1. Précision de la méthode DateDiff
    Par rv_souiller dans le forum SSAS
    Réponses: 2
    Dernier message: 16/10/2012, 16h19
  2. Précisions sur la class Process et la méthode waitFor()
    Par Pierre.B dans le forum Général Java
    Réponses: 13
    Dernier message: 28/08/2009, 16h51
  3. Augmenter la précision avec la méthode de corrélation de phase
    Par Programmeur_Aladdin dans le forum Traitement d'images
    Réponses: 0
    Dernier message: 28/02/2008, 15h59
  4. précision sur la valeur de retour de la méthode GetDirectories
    Par piotrr dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/06/2007, 14h07
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

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