Bilimsel gösterimde ondalık gösterme


161

Bunu nasıl görüntüleyebilirim:

Ondalık ('40800000000.00000000000000') '4.08E + 10' olarak mı?

Bunu denedim:

>>> '%E' % Decimal('40800000000.00000000000000')
'4.080000E+10'

Ama ekstra 0'lar var.


3
Biraz doubleposting, az önce başladığınız bu konuyu kullanabilirsiniz: stackoverflow.com/questions/6913166/…
Samuele Mattiuzzo

13
hayır, hiç değil. Bunu (Python'da nasıl yapılır) ve kimsenin cevaplayacağından şüphe duyduğum zor, belirsiz soru (Django'da nasıl yapılır) içine ayırmak istedim. Bunun nasıl bir cevabı olduğuna dikkat edin. Şimdi birlikte gönderirsem,% 0 yerine son cevabımın yarısıdayım. Bunun yanı sıra, soruları birbirinden ayırmak, insanların cevapları aramasını kolaylaştırır. E., g Bob ondalık biçimlendirme sorusu arıyorsa, başlıkta Django ile bir SO görevini atlayabilir.
Greg

evet, bu sadece benim ilgi için oldu: P bir konu takip etmek daha kolay. temelde benim cevap benzer (sadece bir "biraz" daha spesifik). Ben de bir django cevabı bekliyorum, btw.
Samuele Mattiuzzo

Yanıtlar:


157
from decimal import Decimal

'%.2E' % Decimal('40800000000.00000000000000')

# returns '4.08E+10'

'40800000000.00000000000000' 'de diğer rakamlarla aynı anlama gelen çok daha önemli sıfırlar var. Bu yüzden nerede durmak istediğinizi açık bir şekilde söylemelisiniz.

Sondaki tüm sıfırları otomatik olarak kaldırmak istiyorsanız deneyebilirsiniz:

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'

22
Bir yana, format % valuessözdizimi Python 3 standart kütüphanesinde bile kullanılmasına rağmen, teknik olarak Python 3'te kullanımdan kaldırıldığını veya en azından önerilen biçimlendirme yönteminin kullanılmadığını ve Python 2.6 ile başlayan mevcut önerilen sözdiziminin '{0:.2E}'.format(Decimal('40800000000.00000000000000'))( veya '{:.2E}'Python 2.7+). Bu durum için kesinlikle yararlı olmasa da, ek işlevsellik str.formatiçermeyen ek karakterler nedeniyle , biçim bağımsız değişkenlerinin daha karmaşık bir şekilde karıştırılmasına / yeniden düzenlenmesine / yeniden kullanılmasına izin verir.
JAB

python 3 ne olacak?
Charlie Parker

4
@CharlieParker Kullanımı format. Daha cazibeli .
Mateen Ulhaq


37

Numaranız verildi

x = Decimal('40800000000.00000000000000')

Python 3'ten başlayarak,

'{:.2e}'.format(x)

bunu yapmanın önerilen yoludur.

ebilimsel gösterim istediğiniz .2anlamına gelir ve noktadan sonra 2 basamak istediğiniz anlamına gelir. Yani alacaksınx.xxE±n


1
Ondalık kullanmanın amacı kesin ve keyfi kesinlik ondalık aritmetiği elde etmektir. Bir şamandıra kullanmaya eşdeğer değildir.
asmeurer

@asmeurer Açıklama için teşekkürler. Cevabımı değiştirdim.
patapouf_ai

Bundan yüzmek için geri dönmenin bir yolu var mı?
olenscki

@olenscki float(x)x yapmak şamandıraya dönüşür.
patapouf_ai

33

Hiç kimse .formatyöntemin kısa biçiminden bahsetmedi :

En az Python 3.6 gerekiyor

f"{Decimal('40800000000.00000000000000'):.2E}"

(Sanırım Cees Timmerman ile aynı, biraz daha kısa)


3
Cevap kabul edilmelidir. f-strings python string biçimlendirmenin geleceğidir :)
Gandalf Saxe

1
Kendim gibi gelecekteki okuyuculara bir fyi olarak: basamak sayısını kontrol etmek ve kayan nokta hatalarını {num:E}önemsemiyorsanız, örneğin num = 40800000000.00000000000000
Shayaan


4

Ondalık sayılarım için çok büyük, %Ebu yüzden geliştirmek zorunda kaldım:

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)

İşte bir örnek kullanım:

>>> n = decimal.Decimal(4.3) ** 12314
>>> print format_decimal(n)
3.39e7800
>>> print '%e' % n
inf

3
Hemen "{:.2e}".format(n)döner '3.39e+7800'Python 3.3.2 yılında (v3.3.2: d047928ae3f6, 16 Mayıs 2013, 00:06:53) win32'de [MSC v.1600 64 bit (AMD64)].
Cees Timmerman

4

Bu benim için en iyisi oldu:

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

4

Bu, "Basit" Yanıtlar ve Yorumlar'ın birleştirilmiş listesidir .

PYTHON 3

from decimal import Decimal

x = '40800000000.00000000000000'
# Converted to Float
x = Decimal(x)

# ===================================== # `Dot Format`
print("{0:.2E}".format(x))
# ===================================== # `%` Format
print("%.2E" % x)
# ===================================== # `f` Format
print(f"{x:.2E}")
# =====================================
# ALL Return: 4.08E+10
print((f"{x:.2E}") == ("%.2E" % x) == ("{0:.2E}".format(x)))
# True
print(type(f"{x:.2E}") == type("%.2E" % x) == type("{0:.2E}".format(x)))
# True
# =====================================

YA olmadan IMPORT'ler

# NO IMPORT NEEDED FOR BASIC FLOATS
y = '40800000000.00000000000000'
y = float(y)

# ===================================== # `Dot Format`
print("{0:.2E}".format(y))
# ===================================== # `%` Format
print("%.2E" % y)
# ===================================== # `f` Format
print(f"{y:.2E}")
# =====================================
# ALL Return: 4.08E+10
print((f"{y:.2E}") == ("%.2E" % y) == ("{0:.2E}".format(y)))
# True
print(type(f"{y:.2E}") == type("%.2E" % y) == type("{0:.2E}".format(y)))
# True
# =====================================

karşılaştırma

# =====================================
x
# Decimal('40800000000.00000000000000')
y
# 40800000000.0

type(x)
# <class 'decimal.Decimal'>
type(y)
# <class 'float'>

x == y
# True
type(x) == type(y)
# False

x
# Decimal('40800000000.00000000000000')
y
# 40800000000.0

Yani Python 3 için şimdilik üçünden herhangi biri arasında geçiş yapabilirsiniz.

Benim favorim:

print("{0:.2E}".format(y))

3

Python 3.x yolunu tercih ederim.

cal = 123.4567
print(f"result {cal:.4E}")

4 kayan kısımda gösterilen hane sayısını gösterir.

cal = 123.4567
totalDigitInFloatingPArt = 4
print(f"result {cal:.{totalDigitInFloatingPArt}E} ")

2

Biçim dizesinde kesinlik belirtmeye gerek kalmadan ve sondaki sıfırları eklemeden bir Ondalık'ı bilimsel gösterime dönüştürmek için şu anda kullanıyorum

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

Sondaki sıfırları tutmak için yalnızca normalize().


1

İşte bulabildiğim en basit olanı.

format(40800000000.00000000000000, '.2E')
#'4.08E+10'

('E' büyük / küçük harfe duyarlı değildir. '.2e'yi de kullanabilirsiniz)


0
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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.