과학적 표기법으로 소수 표시


160

이것을 어떻게 표시 할 수 있습니까?

10 진수 ( '40800000000.00000000000000')를 '4.08E + 10'으로?

나는 이것을 시도했다 :

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

그러나 여분의 0이 있습니다.


3
좀 doubleposting, 당신은 방금 시작한이 주제를 사용할 수 있습니다 : stackoverflow.com/questions/6913166/…
Samuele Mattiuzzo

13
아냐, 전혀. 나는 이것을 쉬운 질문 (Python에서 어떻게하는지)과 누군가가 대답하지 않을 것이라는 까다로운 모호한 질문 (Django에서 어떻게하는지)으로 나누고 싶었습니다. 이것이 이미 어떻게 대답했는지 주목하십시오. 함께 게시 한 경우 0 % 대신 최종 답변의 중간에 있습니다. 게다가, 질문을 분리하면 사람들이 답을 더 쉽게 검색 할 수 있습니다. 예를 들어 Bob이 10 진수 형식 질문을 검색하는 경우 제목에서 Django를 사용하여 SO 퀘스트를 건너 뛸 수 있습니다.
Greg Greg

그래, 그것은 단지 내 관심사였습니다 : P 하나의 스레드를 따르는 것이 더 쉽습니다. 기본적으로 내 대답과 비슷합니다 ( "비트"가 더 구체적 임). 나는 장고 답변도 기대하고있다.
Samuele Mattiuzzo

답변:


157
from decimal import Decimal

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

# returns '4.08E+10'

'40800000000.00000000000000'에는 다른 숫자와 동일한 의미를 가진 더 많은 중요한 0이 있습니다. 그래서 어디에서 멈추고 싶은지 명시해야합니다.

후행 0을 모두 자동으로 제거하려면 다음을 시도하십시오.

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
따로, format % values파이썬 3 표준 라이브러리 내에서도 구문이 여전히 사용되고 있음에도 불구하고 기술적으로 파이썬 3에서는 더 이상 사용되지 않거나 권장되는 형식화 방법이 아니며 파이썬 2.6부터 현재 권장되는 구문은 '{0:.2E}'.format(Decimal('40800000000.00000000000000'))( 또는 '{:.2E}'Python 2.7 이상 에서). 추가 된 기능이없는 추가 문자로 인해이 상황에 유용하지는 않지만 str.format형식 인수의 더 복잡한 믹싱 / 재정렬 / 재사용이 가능합니다.
JAB

파이썬 3은 어떻습니까?
찰리 파커

4
@CharlieParker 사용 format. 더 재즈 입니다.
Mateen Ulhaq

120

다음은 format()함수 를 사용하는 예입니다 .

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

형식 대신 f-string을 사용할 수도 있습니다 .

>>> f"{Decimal('40800000000.00000000000000'):.2E}"
'4.08E+10'

3
이 문법은 3.6+의 f-string에도 적용됩니다f"{Decimal('40800000000.00000000000000'):.2E}"
Tritium21

37

당신의 번호를

x = Decimal('40800000000.00000000000000')

파이썬 3부터

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

권장되는 방법입니다.

e과학적 표기법 .2을 원하고 점 뒤에 2 자리 숫자를 원한다는 의미입니다. 그래서 당신은 얻을 것이다x.xxE±n


1
십진수를 사용하는 요점은 정확하고 임의의 정밀도 십진 산술을 얻는 것입니다. float를 사용하는 것과 다릅니다.
asmeurer

@asmeurer 설명해 주셔서 감사합니다. 내 답변을 변경했습니다.
patapouf_ai

이걸로 돌아 오는 방법이 있습니까?
olenscki

@olenscki float(x)는 x를 float로 변환합니다.
patapouf_ai

33

.format방법 의 짧은 형식을 언급 한 사람은 없습니다 .

적어도 Python 3.6이 필요합니다

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

(나는 그것이 조금 더 짧은 Cees Timmerman과 같다고 생각한다)


3
대답을 받아 들여야합니다. F-문자열은 파이썬 문자열의 미래 : 서식한다
간달프 작센

1
나 자신과 같은 미래의 독자들에게 참고로 : 자릿수를 제어하지 않고 부동 소수점 오류를 신경 쓰지 않는다면 {num:E}num = 40800000000.00000000000000
Shayaan


4

내 소수는 너무 커서 %E즉흥 연주해야했습니다.

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)

사용법 예는 다음과 같습니다.

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

3
그냥 "{:.2e}".format(n)반환 '3.39e+7800'파이썬 3.3.2 (V3.3.2 : d047928ae3f6 5 월 16 일 2013 년 0시 6분 53초)는 Win32에서 [MSC v.1600 64 비트 (AMD64)].
Cees Timmerman

4

이것은 나를 위해 가장 잘 작동했습니다.

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

4

이것은 "간단한" 답변 및 의견 의 통합 목록입니다 .

피톤 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
# =====================================

OR없이 IMPORT

# 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
# =====================================

비교

# =====================================
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

따라서 Python 3의 경우 지금 세 가지 중 하나를 전환 할 수 있습니다.

내 즐겨 찾기 :

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

3

파이썬 3.x 방식을 선호합니다.

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

4 부동 부분에 표시되는 자릿수를 나타냅니다.

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

2

형식 문자열에 정밀도를 지정하지 않고 후행 0을 포함하지 않고 Decimal을 과학 표기법으로 변환하려면 현재 사용하고 있습니다.

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

후행 0을 유지하려면을 제거하십시오 normalize().


1

여기 내가 찾을 수있는 가장 간단한 것이 있습니다.

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

( 'E'는 대소 문자를 구분하지 않습니다. '.2e'를 사용할 수도 있습니다)


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.