2013-07-04 23 views
60

Korzystanie z Pythona 2.7 w jaki sposób zaokrąglić moje liczby do dwóch miejsc po przecinku zamiast 10, które daje?Zaokrąglanie do dwóch miejsc po przecinku w Pythonie 2.7?

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

To może być puszka robaków. Czy przechowujesz dane finansowe w zmiennej zmiennoprzecinkowej, a teraz chcesz to zaokrąglić? * Dokładne * zaokrąglanie nie jest możliwe w większości przypadków. Możesz chcieć użyć liczb całkowitych lub "Dziesiętnych", w zależności od tego, co faktycznie próbujesz zrobić. –

+0

Dowiedz się więcej o specyfikatorach formatu. Możesz bezpośrednio drukować wartości zmiennoprzecinkowe, nie konwertując ich na łańcuchy. –

Odpowiedz

161

Użyj wbudowanej funkcji round():

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

lub wbudowanej funkcji format():

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

lub nowe formatowanie styl ciąg:

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

Or o ld styl formatowania ciąg:

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

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

Metoda formatowania ciągów jest przydatna podczas pracy z dziesiętnymi. E.g. 'Decimal (" {:. 2f} ".format (val))' –

+0

@PatchRickWalsh Lub po prostu "Decimal (format (val, .2f '))". –

+9

Super! Nie wiedziałem o tym wbudowanym formacie. Po tym, jak odkryłem więcej, uważam, że jest to najdokładniejszy sposób zaokrąglania, jeśli błędy zmiennoprzecinkowe są absolutnie nie do przyjęcia: 'Decimal ('123.345'). Quantize (Decimal ('1,00'), rounding = decimal.ROUND_HALF_UP)' daje ci ' Dziesiętny ("123.35") '. Z drugiej strony "Dziesiętny (format (dziesiętny (" 123.345 ")," .2f "))" daje "Dziesiętny" ("123.34 ') 'ponieważ dwójkowa reprezentacja 123.345 jest mniejsza niż 123.345. –

1
print "financial return of outcome 1 = $%.2f" % (out1) 
5

Można użyć str.format() też:

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

Podczas pracy z groszy/liczb całkowitych. Pojawi się problem z 115 (jak 1,15 $) i innymi liczbami.

Posiadałem funkcję, która konwertuje liczbę całkowitą na liczbę zmiennoprzecinkową.

... 
return float(115 * 0.01) 

To działało przez większość czasu, ale czasami zwracało coś w rodzaju 1.1500000000000001.

Więc zmieniłem funkcję powrotu tak ...

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

i że powróci 1.15. Nie '1.15' lub(zwraca wartość zmiennoprzecinkową, a nie ciąg)

Przeważnie publikuję to, dlatego pamiętam, co zrobiłem w tym scenariuszu, ponieważ jest to pierwszy wynik w Google.

+0

Jak wskazano w innej odpowiedzi, w przypadku danych finansowych należy stosować liczby dziesiętne, a nie zmiennoprzecinkowe. –

+1

Skończyłem na konwersji wszystkiego na liczby całkowite. Wydaje się, że łatwiej się z tym pracuje. Jednak nie robiłem nic, co dotyczyłoby frakcji grosza. – teewuane

20

Skoro mówisz finansowych figury, ty nie chcą użyć arytmetyki zmiennoprzecinkowej. Lepiej używać Decimal.

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

Wyjście Formatowanie tekstu z nowym stylu format() (domyślnie pół-nawet zaokrąglenia):

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

Zobacz różnice w zaokrąglania powodu zmiennoprzecinkowych niedokładności:

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

Właściwy sposób na rundę wartości finansowych:

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

Oczywistym jest również, aby mieć inne rodzaje zaokrągleń w różnych transakcji:

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

Pamiętaj, że jeśli wyniki symulacji powrotną, ewentualnie będzie musiał rundzie w każdym okresie odsetkowym, ponieważ można nie płacą/otrzymują centów procentowych, ani nie otrzymują odsetek za ułamki w procentach. W przypadku symulacji często stosuje się zmiennoprzecinkowe ze względu na nieodłączne elementy niepewności, ale w takim przypadku zawsze należy pamiętać, że błąd występuje. W związku z tym nawet inwestycje o stałym oprocentowaniu mogą się nieco różnić z powodu tego zwrotu.

2

Najlepiej, jak sądzę, jest użycie format() funkcję:

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

Ale muszę powiedzieć: nie używać formatu okrągłe lub podczas pracy z wartościami finansowych.

+0

'format' wymaga braku napisu dla formatu f. Jeśli nie, masz błąd ValueError. Poprawny kod to: 'format (out1, .2f ')' bez rzutowania na ciąg – danigosa

0

Zamiast tego prostym rozwiązaniem jest najpierw konwersja float na string, wybranie podciągu pierwszych czterech liczb, a następnie zamiana substringu z powrotem na float. Na przykład:

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

Nie mogą być bardzo skuteczne, ale prosty i działa :)

1

Gdy używamy funkcji round(), to nie da prawidłowych wartości.

można sprawdzić go za pomocą, ROUND (2.735) i round (2.725)

skorzystaj

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

Proszę dodać przykład, który testowałeś, wyniki i co według ciebie jest z nimi nie tak. –

+0

importowanie matematyki num = input ('Wprowadź numer') numr = float (round (num, 2)) print numr –

+0

patrz poniżej odpowiedź .. –

0

Zaokrąglanie w górę do najbliższej 0,05, chciałbym zrobić w ten sposób:

def roundup(x): 
    return round(int(math.ceil(x/0.05)) * 0.05,2) 
Powiązane problemy