Jak za pomocą Pythona 2.7 zaokrąglić moje liczby do dwóch miejsc po przecinku, a nie do 10?
print "financial return of outcome 1 =","$"+str(out1)
Jak za pomocą Pythona 2.7 zaokrąglić moje liczby do dwóch miejsc po przecinku, a nie do 10?
print "financial return of outcome 1 =","$"+str(out1)
Decimal
s, w zależności od tego, co faktycznie próbujesz zrobić.Odpowiedzi:
Użyj wbudowanej funkcji
round()
:>>> round(1.2345,2) 1.23 >>> round(1.5145,2) 1.51 >>> round(1.679,2) 1.68
Lub funkcja wbudowana
format()
:>>> format(1.2345, '.2f') '1.23' >>> format(1.679, '.2f') '1.68'
Lub nowe formatowanie ciągu znaków:
>>> "{:.2f}".format(1.2345) '1.23 >>> "{:.2f}".format(1.679) '1.68'
Lub formatowanie ciągów w starym stylu:
>>> "%.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.
źródło
Decimal("{:.2f}".format(val))
Decimal(format(val, '.2f'))
.Decimal('123.345').quantize(Decimal('1.00'), rounding=decimal.ROUND_HALF_UP)
dajeDecimal('123.35')
. Z drugiej stronyDecimal(format(Decimal('123.345'), '.2f'))
daje,Decimal('123.34')
ponieważ binarna reprezentacja 123,345 jest mniejsza niż 123,345.Ponieważ mówisz o liczbach finansowych , NIE CHCESZ używać arytmetyki zmiennoprzecinkowej. Lepiej jest używać Decimal.
>>> from decimal import Decimal >>> Decimal("33.505") Decimal('33.505')
Formatowanie tekstu wyjściowego z nowym stylem
format()
(domyślnie zaokrąglenie w połowie równe):>>> 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ąglaniu spowodowane niedokładnością zmiennoprzecinkową:
>>> 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 zaokrąglenie wartości finansowych :
>>> Decimal("33.505").quantize(Decimal("0.01")) # Half-even rounding by default Decimal('33.50')
Powszechne jest również stosowanie innych rodzajów zaokrąglania w różnych transakcjach:
>>> 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 symulujesz wynik zwrotu, prawdopodobnie będziesz musiał zaokrąglać w każdym okresie odsetkowym, ponieważ nie możesz płacić / otrzymywać ułamków centowych ani otrzymywać odsetek powyżej ułamków centowych. W przypadku symulacji dość często używa się po prostu liczb zmiennoprzecinkowych z powodu nieodłącznych niepewności, ale jeśli to robisz, zawsze pamiętaj, że występuje błąd. W związku z tym nawet inwestycje o stałym oprocentowaniu mogą nieco różnić się zwrotami z tego powodu.
źródło
Możesz też użyć
str.format()
:>>> print "financial return of outcome 1 = {:.2f}".format(1.23456) financial return of outcome 1 = 1.23
źródło
Podczas pracy z groszami / liczbami całkowitymi. Napotkasz problem z 115 (jak w 1,15 $) i innymi liczbami.
Miałem funkcję, która konwertuje liczbę całkowitą na zmiennoprzecinkową.
... return float(115 * 0.01)
To działało przez większość czasu, ale czasami zwracało coś podobnego
1.1500000000000001
.Więc zmieniłem funkcję, aby powrócić w ten sposób ...
... return float(format(115 * 0.01, '.2f'))
i to wróci
1.15
. Not'1.15'
or1.1500000000000001
(zwraca float, a nie string)Przeważnie to publikuję, więc pamiętam, co zrobiłem w tym scenariuszu, ponieważ jest to pierwszy wynik w Google.
źródło
Myślę, że najlepiej jest użyć funkcji format () :
>>> print("financial return of outcome 1 = $ " + format(str(out1), '.2f')) // Should print: financial return of outcome 1 = $ 752.60
Ale muszę powiedzieć: nie używaj zaokrąglenia ani formatu podczas pracy z wartościami finansowymi.
źródło
format
wymaga wartości niebędącej ciągiem dla formatu f. Jeśli nie, masz ValueError. Prawidłowy kod to:format(out1, '.2f')
bez rzutowania na stringKiedy używamy funkcji round (), nie poda ona prawidłowych wartości.
możesz to sprawdzić za pomocą, round (2,735) i round (2,725)
proszę użyć
import math num = input('Enter a number') print(math.ceil(num*100)/100)
źródło
print "financial return of outcome 1 = $%.2f" % (out1)
źródło
Dość prostym sposobem obejścia tego problemu jest najpierw przekonwertowanie zmiennej zmiennoprzecinkowej na łańcuch, wybranie podłańcucha pierwszych czterech liczb, a na koniec przekonwertowanie podciąg z powrotem na zmiennoprzecinkowy. Na przykład:
>>> out1 = 1.2345 >>> out1 = float(str(out1)[0:4]) >>> out1
Może nie być super wydajne, ale proste i działa :)
źródło
Zaokrąglając do następnego 0,05, zrobiłbym to w ten sposób:
def roundup(x): return round(int(math.ceil(x / 0.05)) * 0.05,2)
źródło