Làm thế nào để in một giá trị phần trăm trong python?


183

đây là mã của tôi:

print str(float(1/3))+'%'

và nó cho thấy:

0.0%

nhưng tôi muốn có được 33%

Tôi có thể làm gì?


11
int / int = int, int / float = float, flaot / int = float
AbiusX

3
Phần trăm có nghĩa là một trăm . Nếu bạn có một tỷ lệ đơn giản ( 1/3trong trường hợp của bạn), bạn có một giá trị trên mỗi đơn vị phải nhân nó 100để có được một giá trị phần trăm . Xem các câu trả lời khác cho sự khác biệt giữa phép chia số nguyên và số float.
Apalala

FWIW, trong Python 3.x print(str(float(1/3))+'%')sẽ in 0.3333333333333333%- vẫn không chính xác những gì bạn muốn, nhưng ít nhất nó gần hơn một chút. Điều này là do phân chia hoạt động khác nhau trong phiên bản đó.
martineau

Câu trả lời:


279

formathỗ trợ loại chính xác điểm nổi phần trăm :

>>> print "{0:.0%}".format(1./3)
33%

Nếu bạn không muốn phân chia số nguyên, bạn có thể nhập phân chia của Python3 từ __future__:

>>> from __future__ import division
>>> 1 / 3
0.3333333333333333

# The above 33% example would could now be written without the explicit
# float conversion:
>>> print "{0:.0f}%".format(1/3 * 100)
33%

# Or even shorter using the format mini language:
>>> print "{:.0%}".format(1/3)
33%

4
float(1)thực sự nhiều pythonic hơn 1.?
Tobias Kienzler

@TobiasKienzler, tôi không biết, nếu nó nhiều pythonic hơn. Ít nhất nó là một cái gì đó bạn vấp ngã trong khi đọc mã. Tôi nghĩ với Python 3 và sự phân chia thực sự theo mặc định sự khó chịu này đã biến mất.
miku

Thật. Tôi tự hỏi tại sao Guido không thực hiện phân chia thực sự ngay từ đầu ... Làm tròn 1/3 đến 0 nên rõ ràng sau tất cả ...
Tobias Kienzler

1
@TobiasKienzler Có lẽ vì thời trước, Python gần với C hơn ngày nay.
glglgl

14
Trong Python 2, tôi sẽ sử dụng 1.0thay vì float(1)hoặc 1.. IMHO nó ít gây khó chịu hơn cái trước và không tinh tế như cái trước.
MestreLion

175

Có một cách tùy chọn định dạng 'phần trăm' thuận tiện hơn cho .format()phương thức định dạng:

>>> '{:.1%}'.format(1/3.0)
'33.3%'

4
Có cách nào để làm điều này với "%.1f"định dạng trường học cũ ?
Yuji 'Tomita' Tomita

1
Một chút "ít thuận tiện", nhưng, vâng! Giống như đề xuất ở trênprint("%.1f%%" % (100 * 1.0/3))

12
Đây là câu trả lời tốt nhất vì nó không yêu cầu nhân với 100. Thay vào đó, nó tận dụng lợi thế của thực tế là formatđã biết cách in tỷ lệ phần trăm!
blambert

5
Đây phải là câu trả lời được chấp nhận. Đây là Pythonic nhiều hơn, sử dụng các khả năng tích hợp để loại bỏ chi tiết triển khai vô nghĩa mà phép nhân với 100 sẽ có.
ksadowski

2
vì vậy, theo kiểu chuỗi f sẽ làf"{1/3.0:.1%}"
Kubas

66

Chỉ vì mục đích hoàn chỉnh, vì tôi nhận thấy không ai đề xuất phương pháp đơn giản này:

>>> print("%.0f%%" % (100 * 1.0/3))
33%

Chi tiết:

  • %.0flà viết tắt của " in một float với 0 chữ số thập phân ", do đó %.2fsẽ in33.33
  • %%in một chữ %. Sạch hơn một chút so với bản gốc của bạn+'%'
  • 1.0thay vì 1quan tâm đến việc ép buộc bộ phận nổi, vì vậy không còn nữa0.0

1
lưu ý: 100.0 * 1/3 -> ok, 100.0 * (1/3) -> 0.0 không ok
mpgn

@martialdidit: Tôi biết điều đó, đó là lý do tại sao câu trả lời của tôi không có dấu ngoặc đơn 1/3. Lệnh đánh giá là có chủ ý:100.0 * 1 / 3 => 100.0 / 3 => 0.33...
MestreLion 14/2/2015

Trong mọi trường hợp, tôi đã chuyển sự ép buộc từ 100sang 1, để làm cho mọi thứ rõ ràng.
MestreLion 14/2/2015

2
Xin thứ lỗi, @RuggeroTurra? Đây định dạng, theo nghĩa rộng là nó biến đổi một đầu vào để hiển thị dưới dạng một chuỗi. Xin lưu ý rằng OP không bao giờ yêu cầu sử dụng .format()và định %dạng, còn được gọi là nội suy chuỗi trong Python, là một thay thế hoàn toàn hợp lệ.
MestreLion

Với% bạn đang định dạng float thành một chuỗi. Không phải là một float đến một chuỗi phần trăm. Phép nhân với 100 được thực hiện bằng tay, không phải bằng%. Tôi nghĩ rằng giải pháp đúng duy nhất chỉ sử dụng định dạng là với {: .0%}
Ruggero Turra

38

Bạn đang chia số nguyên sau đó chuyển đổi sang float. Chia bằng phao thay thế.

Như một phần thưởng, hãy sử dụng các phương thức định dạng chuỗi tuyệt vời được mô tả ở đây: http://docs.python.org/l Library / chuỗi.html # format- specification-mini-lingu

Để chỉ định một phần trăm chuyển đổi và độ chính xác.

>>> float(1) / float(3)
[Out] 0.33333333333333331

>>> 1.0/3.0
[Out] 0.33333333333333331

>>> '{0:.0%}'.format(1.0/3.0) # use string formatting to specify precision
[Out] '33%'

>>> '{percent:.2%}'.format(percent=1.0/3.0)
[Out] '33.33%'

Một viên ngọc tuyệt vời!


18

Chỉ cần thêm giải pháp chuỗi 3 Python

prob = 1.0/3.0
print(f"{prob:.0%}")

4

Sau đó, bạn muốn làm điều này thay vào đó:

print str(int(1.0/3.0*100))+'%'

Các .0biểu thị chúng là phao và làm int()tròn chúng thành số nguyên sau đó một lần nữa.


tôi biết đây là từ năm 2011 nhưng ... int()không tròn. ví dụ int(1.9) != 2. Làm tròn có thể được thực hiện như vậy -round(1.9,0) == 2
sở hữu

int()chắc chắn làm tròn xuống số. Ví dụ của tôi làm chính xác những gì tôi muốn làm; cắt bỏ các chữ số vì đó là những gì OP muốn.
Morten Kristensen

Stockoverflow là tuyệt vời - một vài năm và vẫn là một phản ứng. Cảm ơn bạn. Tuy nhiên, để hoàn thiện, tôi muốn làm rõ. int()giảm các chữ số. Nó không làm tròn xuống. Làm tròn ngụ ý nó làm một cái gì đó với các chữ số. Kết quả cuối cùng là như nhau mặc dù; trong ý nghĩa đó, tôi thấy quan điểm của bạn. Ngoài ra, OP không làm rõ những gì anh ấy / cô ấy muốn làm với các chữ số có 33.333 ... làm tròn đến 33. Cảm ơn bạn đã phản hồi bình luận của tôi và có một ngày tuyệt vời!
sở hữu
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.