Voici mon code:
x = 1.0
y = 100000.0
print x/y
Mon quotient s'affiche sous la forme 1.00000e-05
Existe-t-il un moyen de supprimer la notation scientifique et de l’afficher sous la forme 0.00001
? Je vais utiliser le résultat comme une chaîne.
'%f' % (x/y)
mais vous devez gérer vous-même la précision. par exemple.,
'%f' % (1/10**8)
affichera des zéros seulement.
les détails sont dans la documentation
Ou pour Python 3 l'ancien formatage équivalent _ ou le nouveau formatage de style _
Utilisation de la version plus récente ''.format
(n'oubliez pas de spécifier le nombre après le .
que vous souhaitez afficher, cela dépend de la taille du nombre flottant). Voir cet exemple:
>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'
comme indiqué ci-dessus, la valeur par défaut est 6 chiffres! Ce n'est pas utile pour notre exemple, alors nous pourrions utiliser quelque chose comme ceci:
>>> '{:.20f}'.format(a)
'-0.00000000000000007186'
À partir de Python 3.6, ceci peut être simplifié avec le nouveau littéral de chaîne formaté , comme suit:
>>> f'{a:.20f}'
'-0.00000000000000007186'
Avec les nouvelles versions de Python (2.6 et ultérieures), vous pouvez utiliser ''.format()
pour accomplir les suggestions de @SilentGhost:
'{0:f}'.format(x/y)
Une autre option, si vous utilisez pandas et souhaitez supprimer la notation scientifique de tous les flottants, consiste à ajuster les options pandas.
import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
Cela fonctionnera pour tout exposant:
def getExpandedScientificNotation(flt):
str_vals = str(flt).split('e')
coef = float(str_vals[0])
exp = int(str_vals[1])
return_val = ''
if int(exp) > 0:
return_val += str(coef).replace('.', '')
return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
Elif int(exp) < 0:
return_val += '0.'
return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
return_val += str(coef).replace('.', '')
return return_val
Ceci utilise La réponse du capitaine Cucumber , mais avec 2 ajouts.
1) permettant à la fonction d’obtenir des nombres de notation non scientifique et de les renvoyer tels quels (vous pouvez donc entrer beaucoup de données en indiquant que certains des nombres sont 0.00003123 vs 3.123e-05 et ont toujours un travail fonctionnel.
2) ajout du support pour les nombres négatifs. (Dans la fonction d'origine, un nombre négatif finirait par 0,0000-108904 à partir de -1.08904e-05)
def getExpandedScientificNotation(flt):
was_neg = False
if not ("e" in flt):
return flt
if flt.startswith('-'):
flt = flt[1:]
was_neg = True
str_vals = str(flt).split('e')
coef = float(str_vals[0])
exp = int(str_vals[1])
return_val = ''
if int(exp) > 0:
return_val += str(coef).replace('.', '')
return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
Elif int(exp) < 0:
return_val += '0.'
return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
return_val += str(coef).replace('.', '')
if was_neg:
return_val='-'+return_val
return return_val
S'il s'agit d'une string
, utilisez la variable intégrée float
dessus pour effectuer la conversion, par exemple: print( "%.5f" % float("1.43572e-03"))
Answer: 0.00143572
En plus de la réponse de SG, vous pouvez également utiliser le module Decimal:
from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))
# x is a string '0.0001'
Comme il s’agit du meilleur résultat sur Google, je posterai ici après avoir échoué à trouver une solution à mon problème. Si vous souhaitez formater la valeur d'affichage d'un objet float et que celui-ci reste un float - pas une chaîne, vous pouvez utiliser cette solution:
Créez une nouvelle classe qui modifie la manière dont les valeurs flottantes sont affichées.
from builtins import float
class FormattedFloat(float):
def __str__(self):
return "{:.10f}".format(self).rstrip('0')
Vous pouvez modifier vous-même la précision en modifiant les valeurs entières dans {:f}
À partir de la version 3.6 (fonctionne probablement aussi avec la version 3.x légèrement plus ancienne), voici ma solution:
import locale
locale.setlocale(locale.LC_ALL, '')
def number_format(n, dec_precision=4):
precision = len(str(round(n))) + dec_precision
return format(float(n), f'.{precision}n')
Le but du calcul precision
est de garantir que nous avons suffisamment de précision pour rester en dehors de la notation scientifique (la précision par défaut est toujours de 6).
L'argument dec_precision
ajoute une précision supplémentaire à utiliser pour les points décimaux. Étant donné que cela utilise le format n
, aucun zéros non significatif ne sera ajouté (contrairement aux formats f
.). n
prendra également en charge le rendu des entiers déjà arrondis sans décimale.
n
nécessite l'entrée float
, donc la conversion.
En utilisant 3.6.4, j'avais un problème similaire: au hasard, un nombre dans le fichier de sortie serait formaté avec une notation scientifique lors de l'utilisation de ceci:
fout.write('someFloats: {0:0.8},{1:0.8},{2:0.8}'.format(someFloat[0], someFloat[1], someFloat[2]))
Tout ce que je devais faire pour résoudre ce problème était d'ajouter «f»:
fout.write('someFloats: {0:0.8f},{1:0.8f},{2:0.8f}'.format(someFloat[0], someFloat[1], someFloat[2]))