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.
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.
Câu trả lời:
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'
format % values
cú 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.format
cho 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.
format
. Nó vui hơn .
Đây là một ví dụ sử dụng format()
hàm:
>>> "{:.2E}".format(Decimal('40800000000.00000000000000'))
'4.08E+10'
Thay vì định dạng, bạn cũng có thể sử dụng chuỗi f :
>>> f"{Decimal('40800000000.00000000000000'):.2E}"
'4.08E+10'
f"{Decimal('40800000000.00000000000000'):.2E}"
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 đó.
e
có nghĩa là bạn muốn ký hiệu khoa học và .2
có 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
float(x)
sẽ chuyển x thành float.
Không ai đề cập đến hình thức ngắn của .format
phươ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)
{num:E}
, ví dụ: num = 40800000000.00000000000000
Xem các bảng từ định dạng chuỗi Python để chọn bố cục định dạng phù hợp. Trong trường hợp của bạn đó là %.2E
.
Số thập phân của tôi quá lớn %E
nê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
"{:.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.
Đ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
Đây là danh sách tổng hợp các câu trả lời và nhận xét "Đơn giản" .
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
# =====================================
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
# =====================================
# =====================================
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))
Để 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()
.
Đâ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')
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