Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1030 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Précision conversion atof()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Précision conversion atof()

n°1864984
gennosuke
Posté le 23-03-2009 à 20:43:16  profilanswer
 

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 :
 
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 !
 :jap:

mood
Publicité
Posté le 23-03-2009 à 20:43:16  profilanswer
 

n°1865000
masklinn
í dag viðrar vel til loftárása
Posté le 23-03-2009 à 21:33:12  profilanswer
 

gennosuke a écrit :

Mais pour certaines valeurs, par ex. item='0,95', ça me le transforme en item=0.95000000001 ou item=0.94999999999 !


C'est parfaitement normal. Accessoirement atof n'a aucun intérêt:

Code :
  1. >>> import string
  2. >>> string.atof('0.95')
  3. 0.94999999999999996
  4. >>> float('0.95')
  5. 0.94999999999999996
  6. >>>


gennosuke a écrit :

Manque de Précision ?


Pas du tout

gennosuke a écrit :

Comment toujours obtenir item=0.95 ?


http://docs.python.org/library/decimal.html

 

Accessoirement,

 
  • range(0,nb_col) => range(nb_col)
  • if item is not '': => if item


Message édité par masklinn le 23-03-2009 à 21:35:54

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1865007
KangOl
Profil : pointeur
Posté le 23-03-2009 à 22:08:10  profilanswer
 

et surtout: http://docs.python.org/library/csv.html


---------------
Nos estans firs di nosse pitite patreye...
n°1865010
gennosuke
Posté le 23-03-2009 à 22:14:15  profilanswer
 

OK, merci !
Alors :
>>> data[1]
['1', '85', '44729', '42', '458', '3760011174639', '1074416', '6,45', '1']
>>> num_data(data) #avec atof()
>>> data[1]
[1.0, 85.0, 44729.0, 42.0, 458.0, '3760011174639', 1074416.0, 6.4500000000000002, 1.0]
 
tandis que:
>>> data[1][7]=data[1][7].replace(',','.')
>>> data[1][7]
'6.45'
>>> print Decimal(data[1][7])
6.45
 
Ca marche, mais je souhaite :
data[1][7] <- Decimal(data[1][7])
ce qui ferait data[1][7]=6.45
sans passer par print.
 
Je n'ai pas d'idée !

n°1865011
masklinn
í dag viðrar vel til loftárása
Posté le 23-03-2009 à 22:14:27  profilanswer
 


Citation :

j'importe un fichier data.csv via csv reader.


:o

gennosuke a écrit :

OK, merci !
Alors :

Code :
  1. >>> data[1]
  2. ['1', '85', '44729', '42', '458', '3760011174639', '1074416', '6,45', '1']
  3. >>> num_data(data) #avec atof()
  4. >>> data[1]
  5. [1.0, 85.0, 44729.0, 42.0, 458.0, '3760011174639', 1074416.0, 6.4500000000000002, 1.0]
 

tandis que:

Code :
  1. >>> data[1][7]=data[1][7].replace(',','.')
  2. >>> data[1][7]
  3. '6.45'
  4. >>> print Decimal(data[1][7])
  5. 6.45
 

Ca marche, mais je souhaite :
data[1][7] <- Decimal(data[1][7])
ce qui ferait data[1][7]=6.45
sans passer par print.

 

Je n'ai pas d'idée !


T'as réfléchi 3s et essayé de remplacer ton atof pourri par un appel à Decimal, dans ta fonction?

Message cité 1 fois
Message édité par masklinn le 23-03-2009 à 22:15:55

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1865013
KangOl
Profil : pointeur
Posté le 23-03-2009 à 22:15:10  profilanswer
 

masklinn a écrit :


Citation :

j'importe un fichier data.csv via csv reader.


:o


alors l'utilisation de range est foireuse...


---------------
Nos estans firs di nosse pitite patreye...
n°1865014
masklinn
í dag viðrar vel til loftárása
Posté le 23-03-2009 à 22:17:31  profilanswer
 

KangOl a écrit :


alors l'utilisation de range est foireuse...


Bah non.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1865034
gennosuke
Posté le 23-03-2009 à 22:43:43  profilanswer
 

OK, c'est bon.
Après un temps de réflexion supérieur à 3s, j'ai remplacé atof par Decimal.
On trimballe des Decimal(".." ) partout, mais la variable est changée.
Merci

n°1865071
Taz
bisounours-codeur
Posté le 24-03-2009 à 06:46:18  profilanswer
 

Je vous aime bien avec le Decimal, mais on dirait un cours de maths de première année de fac: la majorité des étudiants est incapable d'admettre que 0.99999... = 1. C'est à dire qu'un nombre n'a pas une représentation unique. (Et vice versa en float ;).
 
Au final, sauf calcul financier, rester en float convient très bien. Si les ....02 dérange quelqu'un, y a qu'à formater la sortie et on en parle plus.

n°1865108
gennosuke
Posté le 24-03-2009 à 10:05:12  profilanswer
 

OK, merci des conseils!
J'en ferai bon usage.
A +


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Précision conversion atof()

 

Sujets relatifs
Conversion Decimal to binary et inversement.Problème conversion chaîne en nombre
Conversion date format UTCProblème séparateurs lors de la conversion d'un fichier csv en excel
[C] Conversion Hexa vers ASCIIprécision: template et inline
[PHP] Conversion string to float... mais ca marche pas !conversion cm en pixels et réciproquement
Conversion d'une image en PNGproblème de conversion
Plus de sujets relatifs à : Précision conversion atof()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR