48

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

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

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

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

4

6 回答 6

65

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

>>> "%.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
于 2013-11-14T19:34:10.517 回答
11

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

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

输出:

2606.90
于 2021-02-04T03:27:31.913 回答
5
>>> '{:.2f}'.format(2606.89579999999).replace('.', '')
'260690'
于 2013-11-14T19:36:29.970 回答
1

如果要动态更改小数位数,可以使用以下修改:

def formatNumber(n, digits):
    formatter = formatter = '{:.' + '{}'.format(digits) + 'f}'
    x = round(x, digits)
    return formatter.format(x)

x = 2606.89579999999
digits = 2

formatted_number = formatNumber(x, digits)

这样,您所要做的就是更改digits变量。这将返回:

2606.90
于 2021-08-21T21:02:28.997 回答
0

我在这里看到的答案并不让我满意。所以这里是我的解决方案:

def round_with_padding(value, round_digits):
    return format(round(value,round_digits), "."+str(round_digits)+"f")

希望你喜欢

于 2021-09-25T17:38:03.670 回答
-5
>>> int (round (2606.89579999999,2)*100)
260690
于 2013-11-14T19:51:02.303 回答