Python 2.7'de iki ondalık basamağa yuvarlama?


84

Python 2.7'yi kullanarak, sayılarımı verdiği 10 veya daha fazlası yerine iki ondalık basamağa nasıl yuvarlayabilirim?

print "financial return of outcome 1 =","$"+str(out1)

3
Bu bir kutu solucan olabilir. Finansal verileri bir kayan nokta değişkeninde mi depoluyorsunuz ve şimdi bunu yuvarlamak mı istiyorsunuz? Çoğu durumda tam yuvarlama mümkün değildir. Gerçekte Decimalne yapmaya çalıştığınıza bağlı olarak tamsayı veya s kullanmak isteyebilirsiniz .
Tim Pietzcker

Biçim belirleyicileri hakkında bilgi edinin. Float değerlerini dizelere dönüştürmeden doğrudan yazdırabilirsiniz.
John Doe

Yanıtlar:


201

Yerleşik işlevi kullanın round():

>>> round(1.2345,2)
1.23
>>> round(1.5145,2)
1.51
>>> round(1.679,2)
1.68

Veya yerleşik işlev format():

>>> format(1.2345, '.2f')
'1.23'
>>> format(1.679, '.2f')
'1.68'

Veya yeni stil dizesi biçimlendirmesi:

>>> "{:.2f}".format(1.2345)
'1.23
>>> "{:.2f}".format(1.679)
'1.68'

Veya eski stil dize biçimlendirmesi:

>>> "%.2f" % (1.679)
'1.68'

yardım round:

>>> print round.__doc__
round(number[, ndigits]) -> floating point number

Round a number to a given precision in decimal digits (default 0 digits).
This always returns a floating point number.  Precision may be negative.

2
Dize formatlama yöntemi, Ondalıklarla çalışırken kullanışlıdır. ÖrneğinDecimal("{:.2f}".format(val))
Patch Rick Walsh

@PatchRickWalsh Veya basitçe Decimal(format(val, '.2f')).
Ashwini Chaudhary

9
Güzel! Bu format yerleşikini bilmiyordum. Daha fazlasını keşfettikten sonra, kayan nokta hataları kesinlikle kabul edilemezse yuvarlamanın en doğru yolu olduğunu düşünüyorum: Decimal('123.345').quantize(Decimal('1.00'), rounding=decimal.ROUND_HALF_UP)size verir Decimal('123.35'). Öte yandan üzerinde Decimal(format(Decimal('123.345'), '.2f'))verir Decimal('123.34')123.345 ikili gösterimi az 123,345 çünkü.
Patch Rick Walsh

48

Bahsettiğin bu yana finansal rakamlar, sen İSTEMİYORUM kayan nokta aritmetik kullanmak. Ondalık kullanmanız daha iyi.

>>> from decimal import Decimal
>>> Decimal("33.505")
Decimal('33.505')

Yeni stille metin çıktı biçimlendirmesi format()(varsayılan olarak yarım eşit yuvarlamadır):

>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.505")))
financial return of outcome 1 = 33.50
>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.515")))
financial return of outcome 1 = 33.52

Kayan nokta belirsizliği nedeniyle yuvarlamadaki farklılıkları görün:

>>> round(33.505, 2)
33.51
>>> round(Decimal("33.505"), 2)  # This converts back to float (wrong)
33.51
>>> Decimal(33.505)  # Don't init Decimal from floating-point
Decimal('33.50500000000000255795384873636066913604736328125')

Finansal değerleri yuvarlamanın doğru yolu :

>>> Decimal("33.505").quantize(Decimal("0.01"))  # Half-even rounding by default
Decimal('33.50')

Farklı işlemlerde başka yuvarlama türlerinin olması da yaygındır:

>>> import decimal
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_DOWN)
Decimal('33.50')
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_UP)
Decimal('33.51')

Getiri sonucunu simüle ediyorsanız, muhtemelen her faiz döneminde yuvarlamanız gerekeceğini unutmayın, çünkü kuruş kesir ödeyemez / alamaz veya yüzde kesir üzerinden faiz alamazsınız. Simülasyonlar için doğal belirsizlikler nedeniyle kayan nokta kullanmak oldukça yaygındır, ancak bunu yaparsanız, her zaman hatanın orada olduğunu unutmayın. Bu nedenle, sabit faizli yatırımlar bile bu nedenle getirilerde biraz farklılık gösterebilir.


5

Şunları da kullanabilirsiniz str.format():

>>> print "financial return of outcome 1 = {:.2f}".format(1.23456)
financial return of outcome 1 = 1.23

4

Peni / tamsayılarla çalışırken. 115 (1.15 $ 'da olduğu gibi) ve diğer sayılarla ilgili bir sorunla karşılaşacaksınız.

Bir Tamsayıyı Float'a dönüştürecek bir fonksiyonum vardı.

...
return float(115 * 0.01)

Bu çoğu zaman işe yaradı ama bazen şöyle bir şey döndürürdü 1.1500000000000001.

Ben de işlevimi şöyle döndürdüm ...

...
return float(format(115 * 0.01, '.2f'))

ve bu geri dönecek 1.15. Değil '1.15'veya 1.1500000000000001(dize değil, kayan nokta döndürür)

Bunu çoğunlukla gönderiyorum, böylece bu senaryoda ne yaptığımı hatırlayabiliyorum çünkü bu google'daki ilk sonuç.


Başka bir yanıtta belirtildiği gibi, finansal veriler için kayan sayıları değil ondalık sayıları kullanın.
Bruno Le Floch

1
Çoğu şeyi tam sayıya dönüştürdüm. Çalışması çok daha kolay görünüyor. Ancak, kuruşların kesirleriyle ilgili hiçbir şey yapmıyordum.
teewuane

2

Bence en iyisi format () işlevini kullanmak:

>>> print("financial return of outcome 1 = $ " + format(str(out1), '.2f'))
// Should print: financial return of outcome 1 = $ 752.60

Ama şunu söylemeliyim: finansal değerlerle çalışırken yuvarlak veya format kullanmayın.


formatf biçimi için dize olmayan gerektirir. Değilse, bir ValueError aldınız. Doğru kod: format(out1, '.2f')dizeye çevrim yapmadan
danius

2

Round () fonksiyonunu kullandığımızda doğru değerler vermeyecektir.

yuvarlak (2.735) ve yuvarlak (2.725) kullanarak kontrol edebilirsiniz

lütfen kullan

import math
num = input('Enter a number')
print(math.ceil(num*100)/100)

Lütfen test ettiğiniz bir örneği, sonuçları ve bunlarda neyin yanlış olduğunu düşündüğünüzü ekleyin.
Liran Funaro

import math num = input ('Bir sayı girin') numr = float (round (num, 2)) print numr
Midhun MM


0

Oldukça basit bir çözüm, önce float'ı dizeye dönüştürmek, ilk dört sayının alt dizesini seçmek ve son olarak alt dizeyi tekrar float'a dönüştürmektir. Örneğin:

>>> out1 = 1.2345
>>> out1 = float(str(out1)[0:4])
>>> out1

Süper verimli olmayabilir ama basit ve işe yarıyor :)


2
Bu yöntem çok güvenilmezdir. Değerinizin ondalık noktadan önce birden fazla hanesi varsa, istenen iki ondalık basamağı elde edemezsiniz. Negatif bir sayı ile aynı problem.
André Kuhlmann

0

Sonraki 0,05'e yuvarlayarak, şu şekilde yapardım:

def roundup(x):
    return round(int(math.ceil(x / 0.05)) * 0.05,2)
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.