Làm cách nào để định dạng thập phân để luôn hiển thị 2 chữ số thập phân?


237

Tôi muốn hiển thị:

49 như 49.00

và:

54.9 như 54.90

Bất kể độ dài của số thập phân hay có bất kỳ vị trí thập phân nào, tôi muốn hiển thị một Decimalchữ số có 2 chữ số thập phân và tôi muốn thực hiện theo cách hiệu quả. Mục đích là để hiển thị giá trị tiền.

ví dụ, 4898489.00


4
Bạn cần nó càng lâu càng tốt? Điều đó nghĩa là gì? Bạn có thể thêm các số 0 đứng đầu cho đến khi hết bộ nhớ, nhưng tôi nghi ngờ đó không phải là điều bạn muốn ...
Mark Byers

Tôi cho rằng điều đó có nghĩa là OP đang sử dụng số thập phân. Không chính xác và không hài lòng với độ chính xác của bối cảnh thập phân, giới hạn độ chính xác đến n chữ số như trong "n chữ số chính xác theo nghĩa chặt chẽ" (ví dụ: '123.456' trở thành Số thập phân ('1.2E + 2 ')) và không "n chữ số trong phần phân số" (đối với số thập phân (' 123,45 ')) ... Xem câu trả lời của tôi để cố gắng có ích với điều này. ;-)
Michał Marchot

1
Vâng, họ là cho giá trị tiền.
orokusaki

Câu trả lời:


105

Tôi cho rằng có lẽ bạn đang sử dụng các Decimal()đối tượng từ decimalmô-đun? (Nếu bạn cần chính xác hai chữ số chính xác ngoài dấu thập phân với số lớn tùy ý, bạn chắc chắn nên là, và đó là những gì tiêu đề câu hỏi của bạn gợi ý ...)

Nếu vậy, phần Câu hỏi thường gặp thập phân của tài liệu có cặp câu hỏi / câu trả lời có thể hữu ích cho bạn:

Q. Trong một ứng dụng điểm cố định có hai chữ số thập phân, một số đầu vào có nhiều vị trí và cần được làm tròn. Những người khác không được cho là có chữ số thừa và cần phải được xác nhận. Những phương pháp nào nên được sử dụng?

A. Phương thức quantize () làm tròn đến một số thập phân cố định. Nếu bẫy Inexact được đặt, nó cũng hữu ích cho việc xác thực:

>>> TWOPLACES = Decimal(10) ** -2       # same as Decimal('0.01')
>>> # Round to two places
>>> Decimal('3.214').quantize(TWOPLACES)
Decimal('3.21')
>>> # Validate that a number does not exceed two places
>>> Decimal('3.21').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Decimal('3.21')
>>> Decimal('3.214').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Traceback (most recent call last):
   ...
Inexact: None

Câu hỏi tiếp theo là

H: Khi tôi có hai đầu vào hợp lệ, làm cách nào để duy trì bất biến đó trong suốt ứng dụng?

Nếu bạn cần câu trả lời cho điều đó (cùng với nhiều thông tin hữu ích khác), hãy xem phần đã nói ở trên của các tài liệu . Ngoài ra, nếu bạn giữ Decimals của bạn có hai chữ số chính xác vượt quá dấu thập phân (nghĩa là càng chính xác thì càng cần thiết để giữ tất cả các chữ số ở bên trái dấu thập phân và hai ở bên phải của dấu thập phân và không còn nữa ...), sau đó chuyển đổi chúng thành chuỗi với strsẽ hoạt động tốt:

str(Decimal('10'))
# -> '10'
str(Decimal('10.00'))
# -> '10.00'
str(Decimal('10.000'))
# -> '10.000'

2
Ồ, quên đề cập đến hiệu quả trong câu trả lời ... nhưng tôi đoán dù sao tôi cũng không phải là chuyên gia. Tôi thấy không có lý do tại sao nó sẽ đặc biệt không hiệu quả khi giữ một số "chữ số phân số" cố định xung quanh - mặc dù mọi thao tác được thực hiện trên các số có thể cần một thao tác làm tròn trên kết quả để đưa nó phù hợp với yêu cầu ... Đối với vì lợi ích, điều này có lẽ nên được thực hiện ít nhất có thể - như trước khi xuất bản / in ra cho người dùng.
Michał Marc:

516

Bạn nên sử dụng các đặc tả định dạng mới để xác định cách biểu thị giá trị của bạn:

>>> from math import pi  # pi ~ 3.141592653589793
>>> '{0:.2f}'.format(pi)
'3.14'

Các tài liệu đôi khi có thể hơi khó hiểu, vì vậy tôi khuyên bạn nên tham khảo những điều sau đây, dễ đọc hơn:

Python 3.6 đã giới thiệu phép nội suy chuỗi ký tự (còn được gọi là chuỗi f), vì vậy bây giờ bạn có thể viết đoạn mã ngắn gọn hơn ở trên như sau:

>>> f'{pi:.2f}'
'3.14'

4
@Droogans: Euh ... formatkhông trả về a str, không phải a float: print type({0:.2f}".format(pi))trả về <type 'str'>.
BioGeek

Giáo sư. Động từ quá tải trên từ return. Hãy thay đổi tinh thần thành prints.
Dropogans

20
Nếu bạn không muốn sử dụng trình giữ chỗ số:"{:.2f}".format(pi)
Người dùng

Làm gì 0:? Tôi giả sử đó .là một phần của chuỗi python
information_interchange

135

Phần Hoạt động định dạng chuỗi của tài liệu Python chứa câu trả lời bạn đang tìm kiếm. Nói ngắn gọn:

"%0.2f" % (num,)

Vài ví dụ:

>>> "%0.2f" % 10
'10.00'
>>> "%0.2f" % 1000
'1000.00'
>>> "%0.2f" % 10.1
'10.10'
>>> "%0.2f" % 10.120
'10.12'
>>> "%0.2f" % 10.126
'10.13'

Không có nhu cầu sử dụng 0sau %, và không cần phải bọc numtrong một tuple.
dùng238424

17
Trên thực tế, gói num trong một tuple là một quy ước mã hóa để ngăn ngừa lỗi gõ vịt trên các đối số trong định dạng chuỗi. Nó không có bất kỳ ảnh hưởng nào trong trường hợp này với chuyển đổi float, nhưng nó ngăn ngừa lỗi loại không mong muốn khi chuyển đổi thành chuỗi. Xem xét r = 1; "%s" % r; r = (1, 2); "%s" % rso với r = 1; "%s" % (r,); r = (1,2 ); "%s" % (r,). Như vậy, hầu hết các kiểu mã hóa tinh vi trong python đều sử dụng bộ dữ liệu vô điều kiện ngay bây giờ (và Python 3 không dùng toàn bộ phương thức định dạng chuỗi là dễ bị lỗi).
Travis Bradshaw

Ngoài ra, là một chàng trai có nền tảng toán học, ký hiệu thập phân "trần trụi" là xấu xí. Số 0 hàng đầu không làm tổn thương gì và có vẻ tốt hơn. :)
Travis Bradshaw

3
Về mặt thẩm mỹ không khác. Quan trọng nhất, dù sao thì 0 là giá trị mặc định. Hoàn toàn không có hại trong việc cung cấp mặc định nếu nó làm cho mã có tính thẩm mỹ. Thật thú vị khi có nhiều nhà phát triển chọn không (không thể?) Phân biệt giữa tính chính xác và phong cách. : /
Travis Bradshaw

32

Bạn có thể sử dụng toán tử định dạng chuỗi như vậy:

num = 49
x = "%.2f" % num  # x is now the string "49.00"

Tôi không chắc ý của bạn là "hiệu quả" - điều này gần như chắc chắn không phải là nút cổ chai trong ứng dụng của bạn. Nếu chương trình của bạn đang chạy chậm, hãy lập hồ sơ trước để tìm các điểm nóng, sau đó tối ưu hóa các điểm đó.


1
Tôi nghĩ rằng biến được đặt tên 'f' có thể gây nhầm lẫn cho một số người. Tốt hơn nên gọi nó là một cái gì đó khác cho một ví dụ như Travis dưới đây.
Aleck Landgraf

28
>>> print "{:.2f}".format(1.123456)
1.12

Bạn có thể thay đổi 2trong 2fđối với bất kỳ số điểm thập phân bạn muốn hiển thị.

BIÊN TẬP:

Từ Python3.6, điều này dịch là:

>>> print(f"{1.1234:.2f}")
1.12

19

.format là một cách dễ đọc hơn để xử lý định dạng biến:

'{:.{prec}f}'.format(26.034, prec=2)

18

Trong python 3, một cách để làm điều này sẽ là

'{:.2f}'.format(number)

6

nếu bạn có nhiều tham số bạn có thể sử dụng

 print('some string {0:.2f} & {1:.2f}'.format(1.1234,2.345))
 >>> some string 1.12 & 2.35

3

Nếu bạn đang sử dụng tiền này và cũng muốn giá trị được phân tách bằng ,'bạn có thể sử dụng

$ {:,.f2}.format(currency_value).

ví dụ:

currency_value = 1234.50

$ {:,.f2}.format(currency_value) --> $ 1,234.50

Đây là một chút mã tôi đã viết cách đây một thời gian:

print("> At the end of year " + year_string + " total paid is \t$ {:,.2f}".format(total_paid))

> At the end of year   1  total paid is         $ 43,806.36
> At the end of year   2  total paid is         $ 87,612.72
> At the end of year   3  total paid is         $ 131,419.08
> At the end of year   4  total paid is         $ 175,225.44
> At the end of year   5  total paid is         $ 219,031.80   <-- Note .80 and not .8
> At the end of year   6  total paid is         $ 262,838.16
> At the end of year   7  total paid is         $ 306,644.52
> At the end of year   8  total paid is         $ 350,450.88
> At the end of year   9  total paid is         $ 394,257.24
> At the end of year  10  total paid is         $ 438,063.60   <-- Note .60 and not .6
> At the end of year  11  total paid is         $ 481,869.96
> At the end of year  12  total paid is         $ 525,676.32
> At the end of year  13  total paid is         $ 569,482.68
> At the end of year  14  total paid is         $ 613,289.04
> At the end of year  15  total paid is         $ 657,095.40   <-- Note .40 and not .4  
> At the end of year  16  total paid is         $ 700,901.76
> At the end of year  17  total paid is         $ 744,708.12
> At the end of year  18  total paid is         $ 788,514.48
> At the end of year  19  total paid is         $ 832,320.84
> At the end of year  20  total paid is         $ 876,127.20   <-- Note .20 and not .2

0

Ví dụ cách dễ nhất để chỉ cho bạn cách làm điều đó là:

Mã số:

>>> points = 19.5 >>> total = 22 >>>'Correct answers: {:.2%}'.format(points/total) `

Kết quả: Câu trả lời đúng: 88,64%


-6

Thế còn

print round(20.2564567 , 2)    >>>>>>>        20.25


print round(20.2564567 , 4)    >>>>>>>        20.2564
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.