Hiển thị một số thập phân trong ký hiệu khoa học


159

Làm thế nào tôi có thể hiển thị này:

Số thập phân ('40800000000.00000000000000') là '4.08E + 10'?

Tôi đã thử điều này:

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

Nhưng nó có thêm 0.


3
Đôi khi, bạn có thể đã sử dụng chủ đề này khi bạn mới bắt đầu: stackoverflow.com/questions/6913166/
mẹo

12
không, hoàn toàn không Tôi muốn tách câu hỏi này thành câu hỏi dễ (làm thế nào để làm điều đó trong Python) và câu hỏi khó, tối nghĩa mà tôi nghi ngờ bất cứ ai sẽ trả lời (làm thế nào để làm điều đó trong Django). Lưu ý làm thế nào điều này đã có một câu trả lời. Bây giờ tôi đang đi được nửa câu trả lời cuối cùng thay vì 0% nếu tôi đã đăng chúng cùng nhau. Bên cạnh đó, việc tách các câu hỏi giúp mọi người dễ dàng tìm kiếm câu trả lời hơn. E., g nếu Bob đang tìm kiếm một câu hỏi định dạng thập phân, anh ta có thể bỏ qua một nhiệm vụ SO với Django trong tiêu đề.
Greg

vâng, đó chỉ là mối quan tâm của tôi: P dễ dàng hơn để theo dõi một chủ đề. về cơ bản nó giống với câu trả lời của tôi (chỉ là "một chút" cụ thể hơn). Tôi hy vọng cho một câu trả lời django quá, btw.
Samuele Mattiuzzo

Câu trả lời:


156
from decimal import Decimal

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

# returns '4.08E+10'

Trong '40800000000.00000000000000' của bạn, có nhiều số không có ý nghĩa hơn có cùng ý nghĩa với bất kỳ chữ số nào khác. Đó là lý do tại sao bạn phải nói rõ ràng nơi bạn muốn dừng lại.

Nếu bạn muốn tự động xóa tất cả các số 0 ở cuối, bạn có thể thử:

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
Bên cạnh đó, mặc dù format % valuescú pháp vẫn được sử dụng ngay cả trong thư viện chuẩn Python 3, tôi tin rằng nó bị phản đối về mặt kỹ thuật trong Python 3, hoặc ít nhất không phải là phương thức định dạng được đề xuất và cú pháp được đề xuất hiện tại, bắt đầu với Python 2.6, sẽ là '{0:.2E}'.format(Decimal('40800000000.00000000000000'))( hoặc '{:.2E}'trong Python 2.7+). Mặc dù không thực sự hữu ích cho tình huống này, do các ký tự bổ sung không có chức năng bổ sung, str.formatcho phép trộn / sắp xếp lại / tái sử dụng các đối số định dạng phức tạp hơn.
JAB

còn trăn 3 thì sao?
Charlie Parker

4
@CharlieParker Sử dụng format. Nó vui hơn .
Mateen Ulhaq


37

Cho số của bạn

x = Decimal('40800000000.00000000000000')

Bắt đầu từ Python 3,

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

là cách được đề nghị để làm điều đó.

ecó nghĩa là bạn muốn ký hiệu khoa học và .2có nghĩa là bạn muốn có 2 chữ số sau dấu chấm. Vì vậy, bạn sẽ nhận đượcx.xxE±n


1
Điểm của việc sử dụng Decimal là để có được số học thập phân chính xác và tùy ý. Nó không tương đương với việc sử dụng phao.
asmeker

@asmeker Cảm ơn đã làm rõ. Thay đổi câu trả lời của tôi.
patapouf_ai

Có cách nào để trở lại từ đây để nổi?
olenscki

@olenscki chỉ cần làm float(x)sẽ chuyển x thành float.
patapouf_ai

33

Không ai đề cập đến hình thức ngắn của .formatphương pháp:

Cần ít nhất Python 3.6

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

(Tôi tin rằng nó giống như Cees Timmerman, chỉ ngắn hơn một chút)


3
Nên chấp nhận trả lời. chuỗi f là tương lai của định dạng chuỗi python :)
Gandalf Saxe

1
Là một fyi cho những độc giả tương lai như tôi: nếu bạn không quan tâm đến việc kiểm soát số chữ số và không để ý các lỗi dấu phẩy động, bạn có thể chỉ cần sử dụng {num:E}, ví dụ: num = 40800000000.00000000000000
Shayaan


4

Số thập phân của tôi quá lớn %Enên tôi phải ứng biến:

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)

Đây là một ví dụ sử dụng:

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

3
Chỉ cần "{:.2e}".format(n)trả về '3.39e+7800'trong Python 3.3.2 (v3.3.2: d047928ae3f6, ngày 16 tháng 5 năm 2013, 00:06:53) [MSC v.1600 64 bit (AMD64)] trên win32.
Cees Timmerman

4

Điều này làm việc tốt nhất cho tôi:

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

4

Đây là danh sách tổng hợp các câu trả lời và nhận xét "Đơn giản" .

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

Hoặc không có IMPORT's

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

So sánh

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

Vì vậy, đối với Python 3, bây giờ bạn có thể chuyển đổi giữa bất kỳ trong số ba.

Fav của tôi:

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

3

Tôi thích Python 3.x cách.

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

4 cho biết có bao nhiêu chữ số được hiển thị trong phần nổi.

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

2

Để chuyển đổi một số thập phân thành ký hiệu khoa học mà không cần chỉ định độ chính xác trong chuỗi định dạng và không bao gồm các số 0 ở cuối, tôi hiện đang sử dụng

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

Để giữ bất kỳ số 0 ở cuối, chỉ cần loại bỏ normalize().


1

Đây là cái đơn giản nhất tôi có thể tìm thấy.

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

('E' không phân biệt chữ hoa chữ thường. Bạn cũng có thể sử dụng '.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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.