Округление до двух десятичных знаков в Python 2.7?

84

Используя Python 2.7, как мне округлить мои числа до двух десятичных знаков, а не до 10 или около того?

print "financial return of outcome 1 =","$"+str(out1)
RCN
источник
2
Это может быть банка с червями. Вы храните финансовые данные в переменной с плавающей запятой и теперь хотите округлить их? В большинстве случаев точное округление невозможно. Вы можете использовать целые числа или Decimals, в зависимости от того, что вы на самом деле пытаетесь сделать.
Тим Пицкер 04
Узнайте о спецификаторах формата. Вы можете напрямую печатать значения с плавающей запятой, не преобразовывая их в строки.
John Doe

Ответы:

201

Воспользуйтесь встроенной функцией 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.
Ашвини Чаудхари
источник
2
Метод форматирования строк полезен при работе с десятичными знаками. НапримерDecimal("{:.2f}".format(val))
Патч Rick Walsh
@PatchRickWalsh Или просто Decimal(format(val, '.2f')).
Ашвини Чаудхари
9
Круто! Я не знал об этом встроенном формате. После более подробного изучения я думаю, что это наиболее точный способ округления, если ошибки с плавающей запятой абсолютно неприемлемы: 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.
Патч Рик Уолш
48

Поскольку вы говорите о финансовых показателях, вы НЕ ХОТИТЕ использовать арифметику с плавающей запятой. Вам лучше использовать 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')

Помните, что если вы моделируете результат возврата, вам, возможно, придется округлять в каждом процентном периоде, поскольку вы не можете платить / получать доли центов или получать проценты, превышающие доли центов. Для моделирования довольно часто просто использовать числа с плавающей запятой из-за присущих им неопределенностей, но в этом случае всегда помните, что ошибка есть. Таким образом, даже инвестиции с фиксированной процентной ставкой могут немного отличаться по доходности из-за этого.

Ронан Пайшао
источник
5

Вы также можете использовать str.format():

>>> print "financial return of outcome 1 = {:.2f}".format(1.23456)
financial return of outcome 1 = 1.23
TerryA
источник
4

При работе с копейками / целыми числами. Вы столкнетесь с проблемой с 115 (как в 1,15 доллара) и другими числами.

У меня была функция, которая преобразовывала целое число в число с плавающей запятой.

...
return float(115 * 0.01)

Это работало большую часть времени, но иногда возвращало что-то вроде 1.1500000000000001 .

Поэтому я изменил свою функцию, чтобы она возвращалась вот так ...

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

и это вернется 1.15. Не '1.15'или1.1500000000000001 (возвращает число с плавающей точкой, а не строку)

Я в основном публикую это, чтобы вспомнить, что я сделал в этом сценарии, поскольку это первый результат в Google.

Teewuane
источник
Как указано в другом ответе, для финансовых данных используйте десятичные числа, а не числа с плавающей запятой.
Бруно Ле Флок
1
В итоге я почти все преобразовал в целые числа. Вроде с ним работать намного проще. Однако я не делал ничего, что касалось долей гроша.
teewuane
2

Думаю, лучше всего использовать функцию 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')без
преобразования
2

Когда мы используем функцию round (), она не дает правильных значений.

вы можете проверить это с помощью круглого (2,735) и круглого (2,725)

пожалуйста, используйте

import math
num = input('Enter a number')
print(math.ceil(num*100)/100)
Мидхан ММ
источник
Пожалуйста, добавьте протестированный вами пример, результаты и что вы думаете с ними не так.
Лиран Фунаро
import math num = input ('Enter a number') numr = float (round (num, 2)) print numr
Midhun MM
1
print "financial return of outcome 1 = $%.2f" % (out1)
Джон Доу
источник
0

Довольно простой обходной путь - сначала преобразовать число с плавающей запятой в строку, выбрать подстроку из первых четырех чисел и, наконец, преобразовать подстроку обратно в число с плавающей точкой. Например:

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

Может быть не супер эффективным, но простым и работающим :)

Шан Низ
источник
2
Этот метод очень ненадежный. Если ваше значение содержит более одной цифры перед десятичной точкой, вы не получите два требуемых десятичных разряда. Та же проблема с отрицательным числом.
André Kuhlmann
0

Округляя до следующих 0,05, я бы сделал так:

def roundup(x):
    return round(int(math.ceil(x / 0.05)) * 0.05,2)
Лукас В.Л.
источник