Convertir un nombre à virgule flottante avec une certaine précision, puis copier en chaîne


144

J'ai un nombre à virgule flottante, disons 135.12345678910. Je veux concaténer cette valeur en une chaîne, mais je veux seulement 135.123456789. Avec l'impression, je peux facilement le faire en faisant quelque chose comme:

print "%.9f" % numvar

d' numvarêtre mon numéro d'origine. Y a-t-il un moyen facile de faire ceci?


3
% fait exactement cela -% ne fait pas partie de la fonction d'impression mais de chaîne - voir la documentation Python
michael_s

Réponses:


177

Avec Python <3 (par exemple 2.6 [voir les commentaires] ou 2.7), il y a deux façons de le faire.

# Option one
older_method_string = "%.9f" % numvar

# Option two
newer_method_string = "{:.9f}".format(numvar)

Mais notez que pour les versions Python supérieures à 3 (par exemple 3.2 ou 3.3), la deuxième option est préférée .

Pour plus d'informations sur la deuxième option, je suggère ce lien sur le formatage des chaînes de la documentation Python .

Et pour plus d'informations sur la première option, ce lien suffira et contient des informations sur les différents drapeaux .

Python 3.6 (officiellement publié en décembre 2016), a ajouté la fchaîne littérale, voir plus d'informations ici , qui étend la str.formatméthode (utilisation d'accolades pour f"{numvar:.9f}"résoudre le problème d'origine), c'est-à-dire

# Option 3 (versions 3.6 and higher)
newest_method_string = f"{numvar:.9f}"

résout le problème. Consultez la réponse de @ Or-Duan pour plus d'informations, mais cette méthode est rapide .


1
la deuxième option devrait être newer_method_string = "{:.9f}".format(numvar)- notez la nécessité :de séparer le champ et la mise en forme. J'ai quand même testé ceci sur 2.7.5.
Caltor

1
Pour python 2.6, l'option deux devrait être newer_method_string = "{0:.9f}".format(numvar)- notez le 0 requis pour le champ_nom de cette ancienne version.
ttq

56

Python 3.6

Juste pour être clair, vous pouvez utiliser le formatage de chaîne de caractères . Cela a presque la même syntaxe que la formatméthode, mais la rend un peu plus agréable.

Exemple:

print(f'{numvar:.9f}')

Plus de lecture sur la nouvelle chaîne f:

Voici un diagramme des temps d'exécution des différentes méthodes testées (à partir du dernier lien ci-dessus):

temps d'exécution


52

Utilisation round:

>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'

8

Ce n'est pas l'impression qui fait le formatage, c'est une propriété des chaînes, donc vous pouvez simplement utiliser

newstring = "%.9f" % numvar

Ou utilisez le nouveau formatage de style. valueString = "{:. 9f}". format (nombre)
Zaren

8

Dans le cas où la précision n'est pas connue avant l'exécution, cette autre option de formatage est utile:

>>> n = 9
>>> '%.*f' % (n, numvar)
'135.123456789'

3
Si vous préférez utiliser .format-method, notez que cela peut aussi se faire par des arguments de nidification comme ceci: '{:.{n}f}'.format(numvar,n=n).
nivk

2

Pour définir la précision avec 9 chiffres, obtenez:

print "%.9f" % numvar

Précision de retour avec 2 chiffres:

print "%.2f" % numvar 

Renvoie la précision avec 2 chiffres et une valeur convertie flottante:

numvar = 4.2345
print float("%.2f" % numvar) 

-2

La strfonction a un bug. S'il vous plaît essayez ce qui suit. Vous verrez «0,196553» mais la sortie de droite est «0,196554». Parce que la strvaleur par défaut de la fonction est ROUND_HALF_UP.

>>> value=0.196553500000 
>>> str("%f" % value).replace(".", ",")

2
Qu'est-ce qui se passe avec .vs. ,? Et en quoi est-ce pertinent pour la question de Pauliwago?
Peter Mortensen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.