我一直在编写一个脚本,它从Excel电子表格中获取数据,舍入数字,并删除小数点,例如2606.89579999999变为26069.但是,我需要将数字舍入到两位小数,即使会有一个尾随零,所以2606.89579999999应该变成260690。
我目前拥有它,所以i
从Excel中的单元格中获取数据,并将其四舍五入到两个小数位(i = round(i, 2)
),这给出了上面示例中的单个小数点。
我已经尝试弄清楚如何让它与Decimal
一起使用,但我似乎无法让它发挥作用。
所有其他数字得到舍入,如果舍入值不以'0'结尾,则与round(i, 2)
一起正常工作,但如果数字恰好以* .x0结尾,那么0会被删除关闭和混乱的数据。
答案 0 :(得分:29)
当你在谈论尾随零时,这是关于表示为字符串的问题, 你可以用
>>> "%.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,你可能会选择推出自己的舍入函数,或者使用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