Để có được điều này để làm việc, bạn cần phải chuẩn hóa số thập phân thứ nhất:
>>> x = decimal.Decimal ('10000000')
>>> x.normalize()
Decimal('1E+7')
>>> x.normalize().to_eng_string()
'10E+6'
Lý do cho điều này có thể được phát hiện bởi delving vào nguồn mã.
Nếu bạn kiểm tra to_eng_string()
trong Python 2.7.3 cây nguồn (Lib/decimal.py
từ tar bóng nguồn gzipped here), nó chỉ đơn giản gọi __str__
với eng
set là true.
Sau đó bạn có thể thấy rằng nó quyết định có bao nhiêu chữ số đi đến bên trái của số thập phân ban đầu với:
leftdigits = self._exp + len(self._int)
Bảng dưới đây cho thấy những gì các giá trị dành cho những hai điều:
._exp ._int len leftdigits
----- --------- --- ----------
Decimal (1000000) 0 '1000000' 7 7
Decimal ('1E+6') 6 '1' 1 7
Các mã tiếp tục sau đó là:
if self._exp <= 0 and leftdigits > -6:
# no exponent required
dotplace = leftdigits
elif not eng:
# usual scientific notation: 1 digit on left of the point
dotplace = 1
elif self._int == '0':
# engineering notation, zero
dotplace = (leftdigits + 1) % 3 - 1
else:
# engineering notation, nonzero
dotplace = (leftdigits - 1) % 3 + 1
và bạn có thể thấy rằng, unle ss nó đã có có số mũ trong một phạm vi nhất định (self._exp > 0 or leftdigits <= -6
), sẽ không có số mũ nào được hiển thị trong biểu diễn chuỗi.
Điều tra thêm cho thấy lý do cho hành vi này. Nhìn vào mã, bạn sẽ thấy mã này dựa trên số General Decimal Arithmetic Specification
(PDF here).
Nếu bạn tìm kiếm rằng tài liệu cho to-scientific-string
(mà trên đó to-engineering-string
được chủ yếu dựa), nó khẳng định một phần (diễn giải, và với bit đậm của tôi):
Các "to-khoa học-string" cải đạo hoạt động một số vào một chuỗi, sử dụng ký pháp khoa học nếu số mũ là cần thiết. Thao tác không bị ảnh hưởng bởi ngữ cảnh.
Nếu số là một số hữu hạn thì:
Hệ số là lần đầu tiên chuyển đổi sang một chuỗi trong cơ sở mười bằng cách sử dụng ký tự từ 0 đến 9 không có số không hàng đầu (trừ khi giá trị của nó là số không, trong trường hợp một duy nhất 0 ký tự được sử dụng).
Tiếp theo, số mũ được điều chỉnh được tính; đây là số mũ, cộng với số ký tự trong hệ số được chuyển đổi, ít hơn một. Tức là, số mũ + (độ dài-1), trong đó độ dài là chiều dài của hệ số theo các chữ số thập phân.
Nếu số mũ nhỏ hơn hoặc bằng 0 và số mũ được điều chỉnh lớn hơn hoặc bằng -6, số sẽ được chuyển thành dạng ký tự mà không sử dụng ký hiệu lũy thừa. Trong trường hợp này, nếu số mũ bằng 0 thì không thêm dấu thập phân. Nếu không (số mũ sẽ là số âm), một điểm thập phân sẽ được chèn vào với giá trị tuyệt đối của số mũ xác định số ký tự ở bên phải dấu thập phân. Các ký tự “0” được thêm vào bên trái của hệ số được chuyển đổi nếu cần. Nếu không có ký tự nào đứng trước dấu thập phân sau khi chèn, thì ký tự “0” thông thường được đặt trước.
Nói cách khác, nó đang làm những gì nó đang làm bởi vì đó là những gì tiêu chuẩn bảo nó làm.
tôi tìm thấy giải pháp ở đây "% .4g" % x – lehalle