Ondalık basamakları her zaman 2 ondalık basamak gösterecek şekilde nasıl biçimlendirebilirim?


237

Göstermek istiyorum:

49 gibi 49.00

ve:

54.9 gibi 54.90

Ondalık uzunluğuna veya ondalık basamak olup olmadığına bakılmaksızın Decimal, 2 ondalık basamaklı bir göstermek istiyorum ve bunu verimli bir şekilde yapmak istiyorum. Amaç para değerlerini göstermektir.

Örneğin, 4898489.00


4
Mümkün olduğunca uzun olması mı gerekiyor? Bu ne anlama geliyor? Hafızanız bitene kadar baştaki sıfırları ekleyebilirsiniz, ancak bunun istediğiniz gibi olmadığından şüpheleniyorum ...
Mark Byers

Sanırım OP ondalık kullanıyor demek olabilir. Ondalık ve ondalık bağlamın hassasiyeti ile "kesin anlamda n basamak basamağı" n olduğu gibi n basamağı hassasiyeti sınırlayan mutsuz (örneğin '123.456' Ondalık ('1.2E + 2 ')) ve "kesirli kısımdaki n basamak" değil (Ondalık (' 123.45 ') için) ... Bu konuda yardımcı olmaya çalışmak için cevabımı görün. ;-)
Michał Marczyk

1
Evet, para değerleri içindir.
orokusaki

Yanıtlar:


105

Muhtemelen modüldeki Decimal()nesneleri kullanıyorsunuz decimal? (Ondalık noktasının ötesinde keyfi olarak büyük sayılarla tam iki basamak hassasiyete ihtiyacınız varsa, kesinlikle olmalısınız ve sorunuzun başlığı budur ...)

Öyleyse , dokümanların Ondalık SSS bölümünde sizin için yararlı olabilecek bir soru / cevap çifti vardır:

S. İki ondalık basamaklı sabit noktalı bir uygulamada, bazı girdilerin birçok yeri vardır ve yuvarlanması gerekir. Diğerlerinin fazla basamak içermemesi ve doğrulanması gerekir. Hangi yöntemler kullanılmalıdır?

A. quantize () yöntemi, sabit sayıda ondalık basamağa yuvarlar. Hatalı tuzak ayarlanmışsa, doğrulama için de yararlıdır:

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

Bir sonraki soru şu

S. Geçerli iki yer girişim olduğunda, bu değişmezi bir uygulama boyunca nasıl koruyabilirim?

Bunun cevabına ihtiyacınız varsa (diğer birçok yararlı bilgiyle birlikte), dokümanların yukarıda belirtilen bölümüne bakın . Ayrıca, Decimalharflerinizi ondalık noktanın ötesinde iki basamaklı doğrulukla tutarsanız (ondalık noktanın solundaki ve iki basamağının sağındaki ve daha fazla olmayan tüm basamakları tutmak için gerektiği kadar hassasiyet anlamına gelir ...), sonra bunları dizelere dönüştürmek strişe yarayacaktır:

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

2
Cevapta verimlilikten bahsetmeyi unuttum ... ama sanırım zaten uzman değilim. Sabit sayıda "kesirli basamak" tutmanın özellikle verimsiz olmasının hiçbir nedeni göremiyorum - sayılar üzerinde yapılan herhangi bir işlem, sonuçlarla gereksinimlere uygun hale getirmek için sonuç üzerinde bir yuvarlama işlemi gerektirebilir ... verimlilik açısından, bu muhtemelen mümkün olduğunca seyrek olarak yapılmalıdır - tıpkı kullanıcı için serileştirme / baskı öncesi gibi.
Michał Marczyk

517

Değerinizin nasıl temsil edileceğini tanımlamak için yeni biçim spesifikasyonlarını kullanmalısınız :

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

Dokümantasyon bazen biraz zor olabilir, bu yüzden aşağıdaki daha kolay okunabilir referansları tavsiye ederim:

Python 3.6 değişmez dize enterpolasyonunu (f-dizeleri olarak da bilinir) tanıttı, böylece şimdi yukarıdakileri daha da özlü olarak yazabilirsiniz:

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

4
@Droogans: Euh ... formatbir strdeğil, bir float: print type({0:.2f}".format(pi))döndürür <type 'str'>.
BioGeek

Hata. Kelimede aşırı fiil return. Lütfen bunu zihinsel olarak değiştirin print.
Droogans

20
Sayısal yer tutucuyu kullanmak istemiyorsanız:"{:.2f}".format(pi)
Kullanıcı

Ne yapar 0:? Ben .python dize bir parçası olduğunu varsayalım
information_interchange

135

Dize Biçimlendirme İşlemleri Python belgelerin bölüm aradığınız cevap içerir. Kısacası:

"%0.2f" % (num,)

Bazı örnekler:

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

İçin gerek yok 0sonra %ve sarma gerek numbir de tuple.
user238424

17
Aslında, num'u bir demet içine sarmak, dize biçimlendirmesi sırasında bağımsız değişkenlerde ördek yazma hatasını önlemek için bir kodlama kuralıdır. Bu durumda bir float dönüşümü ile herhangi bir etkisi yoktur, ancak dizelere dönüştürülürken beklenmeyen bir tür hatasını önler. r = 1; "%s" % r; r = (1, 2); "%s" % rKarşı düşünün r = 1; "%s" % (r,); r = (1,2 ); "%s" % (r,). Bu nedenle, python'daki en karmaşık kodlama stilleri şimdi koşulsuz demet kullanır (ve Python 3 dize biçimlendirme yönteminin tamamını hataya eğilimli olarak kullanımdan kaldırmıştır).
Travis Bradshaw

Ayrıca, matematik geçmişi olan bir adam olarak, "çıplak" ondalık gösterim çirkin. Baştaki 0 ​​hiçbir şeye zarar vermez ve daha iyi görünür. :)
Travis Bradshaw

3
Estetik olarak farklı değil. En önemlisi, 0 zaten varsayılan değerdir. Estetik açıdan hoş kodlar için varsayılanı sağlamanın hiçbir zararı yoktur. Kaç geliştiricinin doğruluk ve stil arasında ayrım yapmamayı (yapamayacağını?) Seçmesi ilginçtir. : /
Travis Bradshaw

32

Sen kullanabilirsiniz operatörü biçimlendirme dize böylece:

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

"Verimli" ile ne demek istediğinden emin değilim - bu neredeyse kesinlikle uygulamanızın darboğaz değil . Programınız yavaş çalışıyorsa, önce etkin noktaları bulmak için profil oluşturun ve sonra bunları optimize edin.


1
Bence 'f' olarak adlandırılan değişken bazı insanları şaşırtabilir. Aşağıdaki Travis gibi bir örnek için başka bir şey söylemek daha iyidir.
Aleck Landgraf

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

Değişebilirsin 2içinde 2fgöstermek istediğiniz ondalık noktalarının herhangi bir sayı için.

DÜZENLE:

Bu Python3.6, şu anlama gelir:

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

19

.format, değişken biçimlendirmeyi işlemenin daha okunabilir bir yoludur:

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


6

birden fazla parametreniz varsa kullanabilirsiniz

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

3

Bunu para birimi için kullanıyorsanız ve ayrıca değerin ,'ile ayrılmasını istiyorsanız

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

Örneğin:

currency_value = 1234.50

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

İşte biraz önce yazdığım kod biraz:

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

Bunun nasıl yapılacağını göstermenin en kolay yolu şudur:

Kod:

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

Çıktı: Doğru cevaplar: 88.64%


-6

ne dersin

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


print round(20.2564567 , 4)    >>>>>>>        20.2564
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.