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 :

formatter un float sur 12 character


Sujet :

Python

  1. #1
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Par défaut formatter un float sur 12 character
    bonjour,

    Je n'ai pas trouvé de solution simple pour écrire un flottant sur 12 caractères avec la meilleur précision.

    voici un petit exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nc = 12
    >>> val = 1186212.1987987928
    >>> '{0:12.8f}'.format(val)
    '1186212.19879879'
    pourquoi il ne respecte par la largeur que je lui donne?
    même si je ne précise pas la précision :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> '{0:12f}'.format(val)
    '1186212.198799'
    on dirait que le largeur qu'on fournit est considérée comme largeur minimum...
    Je ne trouve pas ça logique. Y'a quelque chose que j'ai pas compris?

    la solution que j'ai trouvée est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>> '{0:+{whith}.{precision}f}'.format(val,whith = nc, precision = nc-int(math.log10(val))-3)
    '+1186212.199'
    Je suis contraint de rester sur 12 caractères car je doit rester compatible d'un vieux code fortran qui lit par paquet de 12...

    Si quelqu'un a un meilleur solution, je suis preneur.

    Merci

  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,

    je n'ai pas Python 3, juste la 2.6.6 mais je pense que le problème est le même.

    demander d'afficher:

    avec le format:

    est tout simplement impossible. 8 chiffres après la virgule (+ la virgule) ne laissent en fait que 3 chiffres pour la partie entière. Certains langages (le Fortran par exemple) auraient simplement retourné la chaine "************" pour un tel formatage. Python nous protège de ça et adapte le format que le nombre soit "lisible".

    Si tu souhaites véritablement contraindre à 12 caractères l'écriture d'un nombre réel, je te conseille de te pencher sur les options de formatage e et/ou g:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print "%12.8e" % 1186212.1987987928
    1.18621220e+06

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Une particularité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    val = 1186212.1987987928
    val1 = 1291186212.1987987928
    val2 = 8194788918.198
     
    print (str(val))
    print (str(val1))
    print (str(val2))
    patrice@Zeus:~/Bureau$ /usr/bin/python3.1 fltr.py
    1186212.1988
    1291186212.2
    8194788918.2
    patrice@Zeus:~/Bureau$ /usr/bin/python2.6 fltr.py
    1186212.1988
    1291186212.2
    8194788918.2
    Ou je n'ai pas compris ?

    @+

  4. #4
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Par défaut
    je suis d'accord avec toi kango.

    C'est justement du fortran qui va relire le fichier.

    J'aurait voulu avoir la meilleur précision et donc écrire en f quand c'est possible (j'économise ainsi les caractères de la notation scientifique.)

    on n'a donc pas de fonction qui optimise ceci.

    je l'ai donc crée:
    import math
    def form(val,nc=12):
    if abs(val)<=10**nc-3:
    return '{0:+{whith}.{precision}f}'.format(val,whith = nc, precision = nc-int(math.log10(val))-3)
    else:
    return '{0:+{whith}.{precision}G}'.format(val,whith = nc, precision = nc-6)
    print form(12.5)
    print form(12398271.7887687)
    print form(12)
    print form(12.9898798798798798)
    print form(123982719687687)
    qui me renvoi bien:
    +12.50000000
    +12398271.79
    +12.00000000
    +12.98987988
    +1.23983E+14
    aucune fonction intrinsèque n'a l'aire d'être capable de faire cela.



    PauseKawa: j'ai pas compris...
    print (str(87348748764387643874.34))
    8.73487487644e+19

  5. #5
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    J'ai peur d'etre hors sujet (float != Decimal) mais il y a le module decimal contenant la classe Decimal permettant de traiter des décimaux exact.
    Sinon il ya la primitive round() permettant d'arrondir.
    Ou les primitive d'un float qui le divise en real(partie réel) et imag(partie après la virgule).
    Si ca peut t'aider.

Discussions similaires

  1. comment représenter un float sur 16 bit
    Par hamska2 dans le forum C
    Réponses: 3
    Dernier message: 19/06/2007, 15h26
  2. Problème d'interprétation de float sur IE
    Par Fleep dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 30/01/2007, 17h13
  3. Centrer un tableau avec un DIV float sur la droite
    Par lvr dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 29/01/2007, 15h24
  4. [OLE Excel] formatter ecriture float dans une cellule
    Par netah25 dans le forum C++Builder
    Réponses: 1
    Dernier message: 24/01/2006, 10h09
  5. problème de float sur SQL server 2000.
    Par fidji dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 24/07/2003, 14h15

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