Используя Python 2.7, как мне округлить мои числа до двух десятичных знаков, а не до 10 или около того?
print "financial return of outcome 1 =","$"+str(out1)
Используя Python 2.7, как мне округлить мои числа до двух десятичных знаков, а не до 10 или около того?
print "financial return of outcome 1 =","$"+str(out1)
Ответы:
Воспользуйтесь встроенной функцией round()
:
>>> round(1.2345,2)
1.23
>>> round(1.5145,2)
1.51
>>> round(1.679,2)
1.68
Или встроенная функция format()
:
>>> format(1.2345, '.2f')
'1.23'
>>> format(1.679, '.2f')
'1.68'
Или форматирование строки нового стиля:
>>> "{:.2f}".format(1.2345)
'1.23
>>> "{:.2f}".format(1.679)
'1.68'
Или форматирование строк в старом стиле:
>>> "%.2f" % (1.679)
'1.68'
помощь по 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)
дает вам Decimal('123.35')
. С другой стороны, Decimal(format(Decimal('123.345'), '.2f'))
дает, Decimal('123.34')
потому что двоичное представление 123,345 меньше 123,345.
Поскольку вы говорите о финансовых показателях, вы НЕ ХОТИТЕ использовать арифметику с плавающей запятой. Вам лучше использовать Decimal.
>>> from decimal import Decimal
>>> Decimal("33.505")
Decimal('33.505')
Форматирование вывода текста в новом стиле format()
(по умолчанию - половинное округление):
>>> 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
Посмотрите различия в округлении из-за неточности с плавающей запятой:
>>> 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')
Правильный способ округления финансовых значений :
>>> Decimal("33.505").quantize(Decimal("0.01")) # Half-even rounding by default
Decimal('33.50')
Также часто используются другие типы округления в разных транзакциях:
>>> 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')
Помните, что если вы моделируете результат возврата, вам, возможно, придется округлять в каждом процентном периоде, поскольку вы не можете платить / получать доли центов или получать проценты, превышающие доли центов. Для моделирования довольно часто просто использовать числа с плавающей запятой из-за присущих им неопределенностей, но в этом случае всегда помните, что ошибка есть. Таким образом, даже инвестиции с фиксированной процентной ставкой могут немного отличаться по доходности из-за этого.
Вы также можете использовать str.format()
:
>>> print "financial return of outcome 1 = {:.2f}".format(1.23456)
financial return of outcome 1 = 1.23
При работе с копейками / целыми числами. Вы столкнетесь с проблемой с 115 (как в 1,15 доллара) и другими числами.
У меня была функция, которая преобразовывала целое число в число с плавающей запятой.
...
return float(115 * 0.01)
Это работало большую часть времени, но иногда возвращало что-то вроде 1.1500000000000001
.
Поэтому я изменил свою функцию, чтобы она возвращалась вот так ...
...
return float(format(115 * 0.01, '.2f'))
и это вернется 1.15
. Не '1.15'
или1.1500000000000001
(возвращает число с плавающей точкой, а не строку)
Я в основном публикую это, чтобы вспомнить, что я сделал в этом сценарии, поскольку это первый результат в Google.
Думаю, лучше всего использовать функцию format () :
>>> print("financial return of outcome 1 = $ " + format(str(out1), '.2f'))
// Should print: financial return of outcome 1 = $ 752.60
Но я должен сказать: не используйте округление или формат при работе с финансовыми ценностями.
format
требует нестрокового формата для f. Если нет, вы получили ValueError. Правильный код: format(out1, '.2f')
без
Когда мы используем функцию round (), она не дает правильных значений.
вы можете проверить это с помощью круглого (2,735) и круглого (2,725)
пожалуйста, используйте
import math
num = input('Enter a number')
print(math.ceil(num*100)/100)
Довольно простой обходной путь - сначала преобразовать число с плавающей запятой в строку, выбрать подстроку из первых четырех чисел и, наконец, преобразовать подстроку обратно в число с плавающей точкой. Например:
>>> out1 = 1.2345
>>> out1 = float(str(out1)[0:4])
>>> out1
Может быть не супер эффективным, но простым и работающим :)
Округляя до следующих 0,05, я бы сделал так:
def roundup(x):
return round(int(math.ceil(x / 0.05)) * 0.05,2)
Decimal
s, в зависимости от того, что вы на самом деле пытаетесь сделать.