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 :

Gerer le format d'écriture d'un nombre


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Par défaut Gerer le format d'écriture d'un nombre
    Bonjour

    Je vous soumet une petite question, j'ai écrit un petit programme python qui me rempli un tableau de chiffre, ce tableau est ensuite utilisé dans un autre logiciel. En revanche ce logiciel n'aime pas trop les chiffres type 5.1e-3 et prefere 0.0051!! puis-je demander à python de m'ecrire 0.0051 dans mon tableau plutot que 5.1e-3?

    Merci d'avance!

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

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

    oui bien sûr:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write("%f6.4" % 5.1e-3)

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Hello,



    Regarde le module decimal s’il y a quelque chose en rapport.



    Sinon sans aller chercher le module decimal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    x = 8.76/332433.
    print 'x  = '.rjust(16),x
    print "'%f' % x  = ".rjust(16),'%f' % x
    print "'%.13f' % x  = ".rjust(16),'%.13f' % x
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
               x  =  2.63511745224e-05
        '%f' % x  =  0.000026
     '%.13f' % x  =  0.0000263511745
    http://docs.python.org/release/2.5.4...q-strings.html


    On peut mettre une indication de précision aussi élevée que l’on veut dans le formatage.
    "'%.250f' % x sortira 250 chiffres après la virgule.

    Mais ça ne sert à rien car Python fait les calculs sur la base de représentations internes (représentations binaires des nombres) à 52 digits.
    http://docs.python.org/release/2.2.1/tut/node14.html


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    print ' ',8.951/436.3
    print '  ',89.51/436.3
    print
    print repr(8.951/436.3)
    print ' '+repr(89.51/436.3)
    print
    print '%.76f' % (8.951/436.3)
    print ' %.76f' % (89.51/436.3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      0.0205157002063
       0.205157002063
    
    0.020515700206280085
     0.20515700206280083
    
    0.0205157002062800845887391432142976555041968822479248046875000000000000000000
     0.2051570020628008250707097204212914220988750457763671875000000000000000000000
    Les parties en rouge, qui commencent aux 17ièmes chiffres significatifs (et non pas aux 17ièmes décimales) sont différentes parce que les deux nombres sont deux approximations des véritables valeurs, irreprésentables alors que le fait que l’un des deux nombres est 10 fois l’autre entraine qu’à un décalage de décimale près il devrait y avoir les mêmes chiffres dans leurs représentations.




    La sortie de nombre sous forme de formatage de chaine "'%.9f' % x montre manifestement la représentation interne d’un nombre puisqu’on voit des zéros au delà de 52 digits.


    Quand on fait print x , on affiche en fait une approximation de repr(x) . Cette approximation est limitée par Python à 12 digits.


    quant à repr(x) c’est elle même une coupure à 17 digits de la représentation interne de x, qui est elle même (pour certains nombres) une approximation de x.


    Il faut savoir en effet que pour certains nombres même une représentation binaire du nombre sur 52 digits n’est qu’une approximation: la représentation binaire est incapable d’assurer parfaitement la représentation de certains nombres que l’on peut écrire en base 10.



    Ce problème n’est pas lié à la nature de la représentation des nombres en base 2.
    Même en base 10, il est impossible d’écrire certains nombres sous forme d’une suite finie de chiffres, exemple 1/3.
    En base 2 , c’est 0.1 qui est impossible à représenter.

    On atteint là une caractéristique de la repréentation des nombres qui relève des mathématiques et non pas de l’informatique.
    Je pense que c’est lié au fait que l’ensemble R des nombres réeles est continu. Mais là il nous faudrait un vrai mathématicien comme Zavonen.





    Pour obtenir des calculs effectués sur la base d’une précision de la représentation binaire au delà de 52 digits, il faut utiliser le module decimal.

Discussions similaires

  1. Formater une string sur un nombre de caractères fixes
    Par melleb dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 15/05/2008, 09h45
  2. Format d'écriture date de naissance
    Par lusos dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/04/2008, 15h40
  3. gerer le format de type date
    Par debutantasp dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/03/2008, 19h21
  4. [Outlook] Gérer le format *.msg d'Outlook
    Par calogerogigante dans le forum Documents
    Réponses: 7
    Dernier message: 16/03/2006, 16h18
  5. format d'écriture
    Par antigone dans le forum Langage
    Réponses: 4
    Dernier message: 19/09/2005, 12h18

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