12
votes

Formatage de flotteur python - comme "g", mais avec plus de chiffres

J'utilise "g" code> pour formater des valeurs de point flottant, mais il passe en formatage scientifique trop tôt pour moi - au 5ème chiffre:

>>> format(0.0001, "g")
'0.0001'
>>> format(0.00001, "g")
'1e-05'


1 commentaires

Selon un commentaire ci-dessous, ". 6g" est une chaîne de format valide


3 Réponses :


4
votes
"%e" % n if n and log10(abs(n)) < -5 else ("%f" % n).rstrip("0")

4 commentaires

+1 - ou, en tant que doublure: (('% f', '% e') [log10 (n) <-5])% n - Cependant, la solution fonctionne avec positif n seulement.


@eumiro: Bon point sur les numéros négatifs (mis à jour la réponse), mais je n'aime pas vraiment votre doublure. L'indexation d'une tuple par des valeurs booléennes est juste ... non pythonique.


.RStrip ("0") doit être ajouté à la sortie "% F", de sorte que le résultat ressemble plus à "% g"


Un chèque pour n == 0 est également nécessaire (journal non défini pour 0)



3
votes

Si vous utilisez Python 2.7, vous pouvez utiliser la formatage de la chaîne avancée mini-langue : xxx

Vous pouvez alors spécifier la valeur requise du numéro numéro et largeur dynamique .


1 commentaires

Je veux toujours conserver une notation exponentielle pour de petits nombres comme 1E-25 et ne pas afficher 0.0000000000 à la place.



9
votes

J'ai eu la même question.

regarder la documentation python Il semble que g prend également en charge les valeurs de précision:

format général. Pour une précision donnée p> = 1 , cela arrondit le nombre à p chiffres significatifs, puis format le résultat format de point fixe ou en notation scientifique, en fonction de son magnitude.

Je ne sais pas, pourquoi les autres réponses n'utilisent pas cela et je ne suis pas très expérimenté dans python , mais ça marche.

Ceci peut être simplement obtenu en utilisant le format (0.00001, '.10g') où 10 est la précision que vous voulez.


3 commentaires

Merci d'avoir souligné cela. Je trouve que certaines des formatage de chaînes les plus obscures mal documentées ou difficiles à trouver. Cela fonctionne pour moi où j'utilise des pandas pour créer un CSV: dataframe.to_csv (float_format = "%. 12g")


J'ai du mal à comprendre comment g avec la précision fonctionne: f "{10.554545: 2g}" -> '10 .5545 'F "{10.554545: .2G}" ->' 11 'F "{10.554500: 2G}" ->' 10.5545 'F "{10.554500: 3G}" -> '10 .5545' F "{10.554500: 10G}" -> '10.5545' Il semble donc que ce ne soit pas vraiment de précision.


On dirait que vous avez oublié d'inclure un point après le côlon pendant plusieurs exemples? Ou était-ce juste à des fins de test? Je pense que le point est nécessaire et quand il est là, cela fait ce qui est attendu: il tourne 10.554545 dans 11 (deux chiffres significatifs). f "{10.554545: .4g}" entraînera probablement 10.55 . Je n'ai pas essayé, cependant, c'est juste mon hypothèse.