Округление числа в Python, но с сохранением конечных нулей

python floating-point decimal rounding

32600 просмотра

3 ответа

Я работал над сценарием, который берет данные из электронной таблицы Excel, округляет числа и удаляет десятичную точку, например, 2606.89579999999 становится 26069. Однако мне нужно, чтобы число округлялось до двух десятичных знаков, даже если бы было конечный ноль, поэтому 2606.89579999999 должен стать 260690.

В настоящее время у меня есть, поэтому iберет данные из ячейки в Excel и округляет их до двух десятичных разрядов ( i = round(i, 2)), что дает мне одну десятичную точку в приведенном выше примере.

Я пытался выяснить, как заставить это работать Decimal, но я не могу заставить его работать.

Все остальные числа, которые округляются, если округленное значение не заканчивается на «0», нормально работают с round(i, 2), но если числа просто так заканчиваются на * .x0, этот 0 сбрасывается и портится с данными.

Автор: Seth Koberg Источник Размещён: 12.11.2019 09:25

Ответы (3)


36 плюса

Решение

Поскольку вы говорите о конечных нулях, это вопрос о представлении в виде строки, вы можете использовать

>>> "%.2f" % round(2606.89579999999, 2)
'2606.90'

Или используйте современный стиль с formatфункцией:

>>> '{:.2f}'.format(round(2606.89579999999, 2))
'2606.90'

и удалите точку с помощью replaceили translate( _относится к результату предыдущей команды в консоли Python):

>>> _.translate(None, '.')
'260690'

Обратите внимание, что округление здесь не требуется, так как .2fформат применяется к тому же округлению:

>>> "%.2f" % 2606.89579999999
'2606.90'

Но, как вы упомянули в Excel, вы, вероятно, решили бы использовать свою собственную функцию округления или использовать десятичную , поскольку это float.roundможет привести к странным результатам из-за представления с плавающей запятой:

>>> round(2.675, 2)
2.67
>>> round(2606.89579999999, 2)
2606.89

С десятичным использованием квантовать :

>>> from decimal import *
>>> x = Decimal('2606.8950000000001')
# Decimal('2606.8950000000001')
>>> '{}'.format(x.quantize(Decimal('.01'), rounding=ROUND_HALF_EVEN))
'2606.90'

Это, для вашей первоначальной задачи, становится:

>>> x = Decimal('2606.8950000000001')
>>> int((x*100).quantize(1, rounding=ROUND_HALF_EVEN))
260690

И причина странного округления выходит вперед Decimal:

>>> x = Decimal(2606.8950000000001)
# Decimal('2606.89499999999998181010596454143524169921875') # internal float repr
Автор: alko Размещён: 14.11.2013 07:34

3 плюса

>>> '{:.2f}'.format(2606.89579999999).replace('.', '')
'260690'
Автор: Maciej Gol Размещён: 14.11.2013 07:36

-2 плюса

>>> int (round (2606.89579999999,2)*100)
260690
Автор: user2437648 Размещён: 14.11.2013 07:51
Вопросы из категории :
32x32