Comment puis-je afficher ceci:
Décimal ('40800000000.00000000000000') comme '4.08E + 10'?
J'ai essayé ceci:
>>> '%E' % Decimal('40800000000.00000000000000')
'4.080000E+10'
Mais il a ces 0 supplémentaires.
from decimal import Decimal
'%.2E' % Decimal('40800000000.00000000000000')
# returns '4.08E+10'
Dans votre '40800000000.00000000000000', il y a beaucoup plus de zéros significatifs qui ont la même signification que n'importe quel autre chiffre. C'est pourquoi vous devez indiquer explicitement où vous voulez vous arrêter.
Si vous souhaitez supprimer automatiquement tous les zéros de fin, vous pouvez essayer:
def format_e(n):
a = '%E' % n
return a.split('E')[0].rstrip('0').rstrip('.') + 'E' + a.split('E')[1]
format_e(Decimal('40800000000.00000000000000'))
# '4.08E+10'
format_e(Decimal('40000000000.00000000000000'))
# '4E+10'
format_e(Decimal('40812300000.00000000000000'))
# '4.08123E+10'
Voici un exemple utilisant la fonction format()
:
>>> "{:.2E}".format(Decimal('40800000000.00000000000000'))
'4.08E+10'
Compte tenu de votre numéro
x = Decimal('40800000000.00000000000000')
À partir de Python 3,
'{:.2e}'.format(x)
est la façon recommandée de le faire.
e
signifie que vous voulez une notation scientifique et .2
signifie que vous voulez 2 chiffres après le point. Donc vous aurez x.xxE±n
Personne n'a mentionné la forme abrégée de la méthode .format
:
Nécessite au moins Python 3.6
f"{Decimal('40800000000.00000000000000'):.2E}"
(Je crois que c'est la même chose que Cees Timmerman, juste un peu plus court)
Voir les tableaux de format de chaîne Python pour sélectionner la disposition de formatage appropriée. Dans votre cas, c'est %.2E
.
Mes décimales sont trop grandes pour %E
alors j’ai dû improviser:
def format_decimal(x, prec=2):
tup = x.as_Tuple()
digits = list(tup.digits[:prec + 1])
sign = '-' if tup.sign else ''
dec = ''.join(str(i) for i in digits[1:])
exp = x.adjusted()
return '{sign}{int}.{dec}e{exp}'.format(sign=sign, int=digits[0], dec=dec, exp=exp)
Voici un exemple d'utilisation:
>>> n = decimal.Decimal(4.3) ** 12314
>>> print format_decimal(n)
3.39e7800
>>> print '%e' % n
inf
Cela a fonctionné mieux pour moi:
import decimal
'%.2E' % decimal.Decimal('40800000000.00000000000000')
# 4.08E+10
Pour convertir une notation décimale en notation scientifique sans avoir besoin de spécifier la précision dans la chaîne de formatage, et sans inclure les zéros de fin, j'utilise actuellement
def sci_str(dec):
return ('{:.' + str(len(dec.normalize().as_Tuple().digits) - 1) + 'E}').format(dec)
print( sci_str( Decimal('123.456000') ) ) # 1.23456E+2
Pour conserver les zéros à la fin, supprimez simplement la normalize()
.
def formatE_decimal(x, prec=2):
""" Examples:
>>> formatE_decimal('0.1613965',10)
'1.6139650000E-01'
>>> formatE_decimal('0.1613965',5)
'1.61397E-01'
>>> formatE_decimal('0.9995',2)
'1.00E+00'
"""
xx=decimal.Decimal(x) if type(x)==type("") else x
tup = xx.as_Tuple()
xx=xx.quantize( decimal.Decimal("1E{0}".format(len(tup[1])+tup[2]-prec-1)), decimal.ROUND_HALF_UP )
tup = xx.as_Tuple()
exp = xx.adjusted()
sign = '-' if tup.sign else ''
dec = ''.join(str(i) for i in tup[1][1:prec+1])
if prec>0:
return '{sign}{int}.{dec}E{exp:+03d}'.format(sign=sign, int=tup[1][0], dec=dec, exp=exp)
Elif prec==0:
return '{sign}{int}E{exp:+03d}'.format(sign=sign, int=tup[1][0], exp=exp)
else:
return None