web-dev-qa-db-fra.com

Afficher une décimale en notation scientifique

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.

130
Greg
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'
129
eumiro

Voici un exemple utilisant la fonction format():

>>> "{:.2E}".format(Decimal('40800000000.00000000000000'))
'4.08E+10'
100
Cees Timmerman

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

27
patapouf_ai

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)

23
Eulenfuchswiesel

Voir les tableaux de format de chaîne Python pour sélectionner la disposition de formatage appropriée. Dans votre cas, c'est %.2E.

8
Mihai Maruseac

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
4
ubershmekel

Cela a fonctionné mieux pour moi:

import decimal
'%.2E' % decimal.Decimal('40800000000.00000000000000')
# 4.08E+10
3
Matthew Fitch

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().

2
MikeM
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
0
Andrej