在Python中舍入一个数字,但保持结尾为零

在Python中舍入一个数字,但保持结尾为零,python,floating-point,decimal,rounding,Python,Floating Point,Decimal,Rounding,我一直在编写一个脚本,它从Excel电子表格中获取数据,对数字进行四舍五入,并删除小数点,例如,2606.895799999变为26069。但是,我需要将数字四舍五入到小数点后两位,即使后面有一个零,因此2606.8957999999应该变成260690 我目前拥有它,因此I从Excel中的单元格中获取数据,并将其四舍五入到两位小数(I=round(I,2)),这在上面的示例中给出了一个小数点 我已经试着弄清楚如何使用Decimal,但似乎无法让它工作 所有其他四舍五入的数字,如果四舍五入的值不

我一直在编写一个脚本,它从Excel电子表格中获取数据,对数字进行四舍五入,并删除小数点,例如,2606.895799999变为26069。但是,我需要将数字四舍五入到小数点后两位,即使后面有一个零,因此2606.8957999999应该变成260690

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

我已经试着弄清楚如何使用
Decimal
,但似乎无法让它工作


所有其他四舍五入的数字,如果四舍五入的值不以“0”结尾,则可以使用
四舍五入(i,2)
,但如果这些数字恰好以*.x0结尾,则0会被删除并与数据混淆。

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

>>> "%.2f" % round(2606.89579999999, 2)
'2606.90'
或使用带有
格式
功能的现代风格:

>>> '{:.2f}'.format(round(2606.89579999999, 2))
'2606.90'
并使用
replace
translate
删除点(
指python控制台中上一个命令的结果):

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

>>> "%.2f" % 2606.89579999999
'2606.90'
但正如您提到的excel,您可能会选择滚动您自己的舍入函数,或使用,如
float。由于float表示,舍入可能会导致奇怪的结果:

>>> round(2.675, 2)
2.67
>>> round(2606.89579999999, 2)
2606.89
使用十进制:

对于您的原始任务,它将成为:

>>> x = Decimal('2606.8950000000001')
>>> int((x*100).quantize(1, rounding=ROUND_HALF_EVEN))
260690
奇怪的四舍五入原因以
小数排在前面:

>>> x = Decimal(2606.8950000000001)
# Decimal('2606.89499999999998181010596454143524169921875') # internal float repr

从Python3.6开始,还可以使用内联格式来设置数字。在这种情况下,所需的格式是带2位小数的浮点,因此您可以使用
.2f
作为格式说明符:

x=2606.8957999999
x=圆形(x,2)#严格来说不需要,因为格式会为您圆形
打印(f'{x:.2f}')
输出:

2606.90

我想我已经弄明白了-使用
I=('%.2f'%I)
似乎很有效。我将用其他数字测试它,以验证它是否有效2606.8957999999应该变成260690或2606.90?@SethKoberg如果你不知怎么漏掉了,我会用十进制的例子更新我的答案(编辑了很多帖子,以便更清楚更准确)无需使用
舍入调用:
.2f
将为您进行舍入。
%.2f
已为您进行舍入,因此您也可以使用:
“%.2f”%(2606.8957999999)
格式(2606.8957999999,.2f')
@MarkDickinson不确定它的舍入方式是否完全相同,事实上它does@alko:通常是这样。:-)不过,Python2.6及更早版本中存在一些奇怪之处。但如果你坚持使用Python3或Python2.7,你就安全了。@MarkDickinson我刚用2.7和3.3 cP和PyPy检查过,忘记了2.6:)这是个坏主意<代码>>>整数(整数(0.29,2)*100)
->
28
>>> x = Decimal(2606.8950000000001)
# Decimal('2606.89499999999998181010596454143524169921875') # internal float repr
>>> '{:.2f}'.format(2606.89579999999).replace('.', '')
'260690'
>>> int (round (2606.89579999999,2)*100)
260690
2606.90