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

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

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

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

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

3 ответов


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

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

или использовать современный стиль с :

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

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

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

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

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

но, как вы упомянули excel, вы, вероятно, предпочли бы свернуть свою собственную функцию округления или использовать decimal, as 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

>>> '{:.2f}'.format(2606.89579999999).replace('.', '')
'260690'

>>> int (round (2606.89579999999,2)*100)
260690