Округление числа в 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