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)
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.
Decimal("{:.2f}".format(val))
Decimal(format(val, '.2f'))
.
Decimal('123.345').quantize(Decimal('1.00'), rounding=decimal.ROUND_HALF_UP)
daje Decimal('123.35')
. Z drugiej strony Decimal(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.
Możesz też użyć str.format()
:
>>> print "financial return of outcome 1 = {:.2f}".format(1.23456)
financial return of outcome 1 = 1.23
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'
or 1.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.
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.
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 string
Kiedy 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)
print "financial return of outcome 1 = $%.2f" % (out1)
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 :)
Decimal
s, w zależności od tego, co faktycznie próbujesz zrobić.