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)
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)
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.
Metoda formatowania ciągów jest przydatna podczas pracy z dziesiętnymi. E.g. 'Decimal (" {:. 2f} ".format (val))' –
@PatchRickWalsh Lub po prostu "Decimal (format (val, .2f '))". –
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. –
print "financial return of outcome 1 = $%.2f" % (out1)
Można użyć str.format()
też:
>>> print "financial return of outcome 1 = {:.2f}".format(1.23456)
financial return of outcome 1 = 1.23
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.
Jak wskazano w innej odpowiedzi, w przypadku danych finansowych należy stosować liczby dziesiętne, a nie zmiennoprzecinkowe. –
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
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.
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.
'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
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 :)
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)
Proszę dodać przykład, który testowałeś, wyniki i co według ciebie jest z nimi nie tak. –
importowanie matematyki num = input ('Wprowadź numer') numr = float (round (num, 2)) print numr –
patrz poniżej odpowiedź .. –
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)
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ć. –
Dowiedz się więcej o specyfikatorach formatu. Możesz bezpośrednio drukować wartości zmiennoprzecinkowe, nie konwertując ich na łańcuchy. –