在Python中舍入一个数字但保持结束零

时间:2013-11-14 19:32:42

标签: python floating-point decimal rounding

我一直在编写一个脚本,它从Excel电子表格中获取数据,舍入数字,并删除小数点,例如2606.89579999999变为26069.但是,我需要将数字舍入到两位小数,即使会有一个尾随零,所以2606.89579999999应该变成260690。

我目前拥有它,所以i从Excel中的单元格中获取数据,并将其四舍五入到两个小数位(i = round(i, 2)),这给出了上面示例中的单个小数点。

我已经尝试弄清楚如何让它与Decimal一起使用,但我似乎无法让它发挥作用。

所有其他数字得到舍入,如果舍入值不以'0'结尾,则与round(i, 2)一起正常工作,但如果数字恰好以* .x0结尾,那么0会被删除关闭和混乱的数据。

4 个答案:

答案 0 :(得分:29)

当你在谈论尾随零时,这是关于表示为字符串的问题, 你可以用

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

或使用带有format功能的现代风格:

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

并删除带有replacetranslate的点(_指的是python控制台中上一个命令的结果):

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

请注意,此处不需要舍入,因为.2f格式适用相同的舍入:

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

但是正如你提到的excel,你可能会选择推出自己的舍入函数,或者使用decimal,因为float.round会因浮点表示而导致奇怪的结果:

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

使用小数quantize

>>> 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

答案 1 :(得分:5)

从 Python 3.6 开始,您还可以使用 f-string 对数字进行内联格式化。在这种情况下,所需的格式是带有 2 个小数位的浮点数,因此您可以使用 .2f 作为格式说明符:

x = 2606.89579999999
x = round(x, 2)      # not strictly necessary as format will round for you
print(f'{x:.2f}')

输出:

2606.90

答案 2 :(得分:3)

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

答案 3 :(得分:-1)

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