วิธีการพิมพ์ค่าร้อยละในหลาม?


184

นี่คือรหัสของฉัน:

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

และมันแสดงให้เห็น:

0.0%

แต่ฉันต้องการได้รับ 33%

ฉันควรทำอย่างไร


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

3
ร้อยละวิธีการต่อร้อย หากคุณมีอัตราส่วนอย่างง่าย ( 1/3ในกรณีของคุณ) คุณมีค่าต่อหน่วยที่ต้องคูณด้วย100เพื่อให้ได้ค่าเปอร์เซ็นต์ ดูคำตอบอื่น ๆ สำหรับความแตกต่างระหว่างจำนวนเต็มและการหารลอย
Apalala

FWIW ใน Python 3.x print(str(float(1/3))+'%')จะพิมพ์0.3333333333333333%- ยังไม่ตรงกับที่คุณต้องการ แต่อย่างน้อยก็ใกล้เข้ามา นี่เป็นเพราะการแบ่งทำงานแตกต่างกันในรุ่นนั้น
martineau

คำตอบ:


280

formatรองรับประเภทความแม่นยำจุดลอยตัวร้อยละ:

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

หากคุณไม่ต้องการการแบ่งจำนวนเต็มคุณสามารถนำเข้าการแบ่งของ Python3 ได้จาก__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)จริงมากขึ้น pythonic กว่า1.?
Tobias Kienzler

@TobiasKienzler ฉันไม่รู้ถ้ามันเป็น pythonic เพิ่มเติม อย่างน้อยก็เป็นสิ่งที่คุณสะดุดในขณะที่อ่านรหัส ฉันคิดว่า Python 3 และการหารที่แท้จริงโดยค่าเริ่มต้นการระคายเคืองนี้หายไป
miku

จริง ฉันสงสัยว่าทำไมกุยโดไม่ใช้การแบ่งที่แท้จริงตั้งแต่เริ่มต้น ... การปัดเศษ 1/3 ถึง 0 ควรชัดเจนหลังจากทั้งหมด ...
Tobias Kienzler

1
@TobiasKienzler อาจเป็นเพราะในช่วงเวลาก่อนหน้านี้ Python ใกล้ชิดกับ C มากกว่าทุกวันนี้
glglgl

14
ในหลาม 2 ฉันต้องการใช้1.0แทนหรือfloat(1) 1.IMHO มันน่ารำคาญน้อยกว่ารุ่นก่อนและไม่ละเอียดกว่ารุ่นหลัง
MestreLion

176

มีตัวเลือกการจัดรูปแบบ 'เปอร์เซ็นต์' ที่สะดวกยิ่งขึ้นสำหรับ.format()วิธีการจัดรูปแบบ:

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

4
มีวิธีในการทำเช่นนี้กับ"%.1f"การจัดรูปแบบโรงเรียนเก่าหรือไม่?
Yuji 'Tomita' Tomita

1
นิด ๆ หน่อย ๆ "ไม่สะดวก" แต่ใช่! เช่นเดียวกับที่แนะนำข้างต้นprint("%.1f%%" % (100 * 1.0/3))

12
นี่เป็นคำตอบที่ดีที่สุดเพราะไม่จำเป็นต้องคูณด้วย 100 แต่ใช้ประโยชน์จากความจริงที่formatรู้วิธีพิมพ์เปอร์เซ็นต์!
blambert

5
นี่ควรเป็นคำตอบที่ยอมรับได้ นี่คือ Pythonic อื่น ๆ อีกมากมายโดยใช้ความสามารถในตัวเพื่อกำจัดรายละเอียดการใช้งานที่ไร้ความหมายซึ่งการคูณด้วย 100 จะเป็น
ksadowski

2
ดังนั้นในรูปแบบ f-string มันจะเป็นf"{1/3.0:.1%}"
Kubas

66

เพื่อความสมบูรณ์เพียงเพราะฉันสังเกตเห็นไม่มีใครแนะนำวิธีการง่าย ๆ นี้:

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

รายละเอียด:

  • %.0fย่อมาจาก " พิมพ์ทศนิยมด้วยทศนิยม 0 ตำแหน่ง " ดังนั้น%.2fจะพิมพ์33.33
  • %% พิมพ์ตัวอักษร %พิมพ์ตัวอักษรสะอาดกว่าของคุณเล็กน้อย+'%'
  • 1.0แทนที่จะ1ดูแลการบีบบังคับกองให้ลอยจึงไม่มีอีกต่อไป0.0

1
หมายเหตุ: 100.0 * 1/3 -> ตกลง, 100.0 * (1/3) -> 0.0 ไม่ตกลง
mpgn

@martialdidit: ฉันรู้ว่านั่นเป็นเหตุผลที่คำตอบของฉันไม่ได้1/3มีวงเล็บใน ลำดับการประเมินผลโดยเจตนา:100.0 * 1 / 3 => 100.0 / 3 => 0.33...
MestreLion

ไม่ว่าในกรณีใดฉันได้ย้ายการข่มขู่จาก100ไปยัง1เพื่อทำให้ชัดเจน
MestreLion

2
ขอให้อภัยคุณ @RuggeroTurra? นี่คือการจัดรูปแบบในแง่กว้างที่จะแปลงอินพุตให้แสดงเป็นสตริง โปรดทราบว่า OP ไม่จำเป็นต้องใช้.format()และ - การจัด%รูปแบบหรือที่เรียกว่าการสอดแทรกสตริงใน Python เป็นทางเลือกที่ถูกต้องสมบูรณ์
MestreLion

ด้วย% คุณกำลังจัดรูปแบบลอยเป็นสตริง ไม่ใช่การลอยเป็นเปอร์เซ็นต์สตริง การคูณด้วย 100 ทำได้ด้วยมือไม่ใช่ด้วยการใช้% ฉันคิดว่าทางออกที่ถูกต้องเพียงอย่างเดียวซึ่งใช้การจัดรูปแบบคือด้วย {: .0%}
Ruggero Turra

38

คุณกำลังหารจำนวนเต็มแล้วแปลงเป็นการลอย หารด้วยลอยแทน

เป็นโบนัสใช้วิธีการจัดรูปแบบสตริงที่น่ากลัวที่อธิบายไว้ที่นี่: http://docs.python.org/library/string.html#format-specification-mini-language

เพื่อระบุการแปลงเปอร์เซ็นต์และความแม่นยำ

>>> 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%'

อัญมณีที่ยอดเยี่ยม!



4

จากนั้นคุณต้องการทำสิ่งนี้แทน:

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

.0หมายถึงพวกเขาเป็นลอยและint()รอบพวกเขาที่จะจำนวนเต็มหลังจากนั้นอีกครั้ง


ฉันรู้ว่านี่คือจาก 2011 แต่ ... int()ไม่ได้รอบ int(1.9) != 2เช่น การปัดเศษสามารถทำได้เช่นนั้นround(1.9,0) == 2
เจ้าของ

int()จะปัดเศษตัวเลขลงอย่างแน่นอน ตัวอย่างของฉันทำในสิ่งที่ฉันตั้งใจจะทำ ตัดตัวเลขเพราะนั่นคือสิ่งที่ OP ต้องการ
Morten Kristensen

Stockoverflow ยอดเยี่ยม - สองปีและยังคงตอบสนอง ขอบคุณ. อย่างไรก็ตามเพื่อความสมบูรณ์ฉันต้องการชี้แจง int()วางตัวเลข มันไม่กลม การปัดเศษหมายความว่ามันทำอะไรกับตัวเลข ผลลัพธ์ที่ได้ก็เหมือนกัน ในแง่นั้นฉันเห็นประเด็นของคุณ นอกจากนี้ OP ยังไม่ชี้แจงสิ่งที่เขา / เธอต้องการจะทำกับตัวเลขที่มี 33.333 ... ไม่ถึง 33 ขอบคุณสำหรับการตอบสนองต่อความคิดเห็นของฉันและมีวันที่ดี!
เป็นเจ้าของ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.