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?

Pauliwago
la source
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 .

HAL 9001
la source
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

Ou Duan
la source
52

Utilisation round:

>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'
shantanoo
la source
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
John La Rooy
la source
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'
Yu Hao
la source
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) 
Débardeur Tejas
la source
-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(".", ",")
éthemsulane
la source
2
Qu'est-ce qui se passe avec .vs. ,? Et en quoi est-ce pertinent pour la question de Pauliwago?
Peter Mortensen