在python中,将浮点舍入为点后的2位数字

在python中,将浮点舍入为点后的2位数字,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我正在使用以下代码: f = 0.3223322 float('%.2f' % (f)) 没有2个铸件是否有更多的pythonic、更少的冗长方法? 文档中的以下注释不利于使用 float的round()行为可能令人惊讶:例如, 四舍五入(2.675,2)得到的是2.67,而不是预期的2.68。这不是一个好主意 错误:这是因为大多数小数不能被替换 精确地表示为浮点数。请参阅浮点运算:问题 以及更多信息的限制 : 请注意,由于浮点不精确,在生成输出时,您可能仍然希望使用一定精度的字符串格式 根据

我正在使用以下代码:

f = 0.3223322
float('%.2f' % (f))
没有2个铸件是否有更多的pythonic、更少的冗长方法? 文档中的以下注释不利于使用

float的round()行为可能令人惊讶:例如, 四舍五入(2.675,2)得到的是2.67,而不是预期的2.68。这不是一个好主意 错误:这是因为大多数小数不能被替换 精确地表示为浮点数。请参阅浮点运算:问题 以及更多信息的限制

:

请注意,由于浮点不精确,在生成输出时,您可能仍然希望使用一定精度的字符串格式

根据您试图实现的目标,可能适合使用
Decimal
类型:

>>> from decimal import Decimal
>>> round(Decimal(0.3223322), 2)
Decimal('0.32')

它的数学形式是(令人惊讶的!)十进制,而不是二进制,因此在十进制舍入方面没有任何问题(除非最初您试图从浮点创建它)。

好的旧内置函数有什么问题

像这样使用它:

round(input, digits)
示例输出:

>>> f = 0.3223322
>>> round(f, 2)
0.32

这没那么好,但我一直都很喜欢:

f=float(int(100*f))/100
远不是最好的方法,但这是我经常使用的方法。

我会选择
round()
,但如果您不喜欢它的行为,您可以随时编写自己的
round()
,因此,为了完整性:

def custom_round(number, ndigits=2):
    return int(number * 10 ** ndigits) / 10.0 ** ndigits if ndigits else int(number)

请记住,与内置的
舍入()不同,此舍入向下舍入,而不是向上舍入。

您可以使用十进制进行量化和舍入。四舍五入半向上是一种数学四舍五入

from decimal import Decimal, ROUND_HALF_UP

>>> Decimal('123.527').quantize(Decimal('.01'), rounding=ROUND_HALF_UP)
Decimal('123.53')

>>> Decimal('123.525').quantize(Decimal('.01'), rounding=ROUND_HALF_UP)
Decimal('123.53')

请注意,
float('%.2f'%f)
round()
的问题完全相同。这是因为,正如文档所说,这是对计算机上浮点运算方式的限制。在大多数情况下我都不会担心。如果它确实重要,我认为最好使用
十进制
模块,或
分数
模块,或一些任意精度库,取决于具体的使用情况。您尝试舍入的目的是什么?在舍入函数中,如果您的数字大于5位,则返回的数字大于您的例外数字,例如:舍入(3.248)=>3.25
from decimal import Decimal, ROUND_HALF_UP

>>> Decimal('123.527').quantize(Decimal('.01'), rounding=ROUND_HALF_UP)
Decimal('123.53')

>>> Decimal('123.525').quantize(Decimal('.01'), rounding=ROUND_HALF_UP)
Decimal('123.53')