如何将浮点列表中的每个项目舍入到2位小数?

时间:2011-03-16 13:37:07

标签: python

我有一个由浮点值组成的列表,但它们太详细而无法继续。我知道我们可以使用("%.f" % variable)运算符缩短它们,例如:

result = [359.70000000000005]
result = "%.2f" % result
result = [359.70]

我的问题是如何在不使用迭代器的情况下将值列表转换为舍入的等价物。我尝试了一些东西,但却引发了TypeError

list = [0.30000000000000004, 0.5, 0.20000000000000001]
list = "%.2f" % list
TypeError: not all arguments converted during string formatting

我如何提供一个干净的清单,如:

list = [0.30, 0.5, 0.20]

6 个答案:

答案 0 :(得分:60)

"%.2f"不会返回 clean float。它返回一个字符串,表示这个带有两位小数的浮点数。

my_list = [0.30000000000000004, 0.5, 0.20000000000000001]
my_formatted_list = [ '%.2f' % elem for elem in my_list ]

返回:

['0.30', '0.50', '0.20']

另外,请勿调用变量list。这是列表创建的保留字。使用其他名称,例如my_list

如果您想获得[0.30, 0.5, 0.20](或至少是最接近的浮点数),您可以尝试:

my_rounded_list = [ round(elem, 2) for elem in my_list ]

返回:

[0.29999999999999999, 0.5, 0.20000000000000001]

答案 1 :(得分:10)

您可能希望查看Python的decimal模块,它可以使用浮点数并更直观地使用它们进行算术运算。以下是使用它来“清理”列表值的一种方法的简单示例:

>>> from decimal import *
>>> mylist = [0.30000000000000004, 0.5, 0.20000000000000001]
>>> getcontext().prec = 2
>>> ["%.2f" % e for e in mylist]
['0.30', '0.50', '0.20']
>>> [Decimal("%.2f" % e) for e in mylist]
[Decimal('0.30'), Decimal('0.50'), Decimal('0.20')]
>>> data = [float(Decimal("%.2f" % e)) for e in mylist]
>>> data
[0.3, 0.5, 0.2]

答案 2 :(得分:8)

如果你真的想要一个无迭代器的解决方案,你可以使用numpy及其array round函数。

import numpy as np
myList = list(np.around(np.array(myList),2))

答案 3 :(得分:1)

mylist = [0.30000000000000004, 0.5, 0.20000000000000001]
myRoundedList =  [round(x,2) for x in mylist] 
# [0.3, 0.5, 0.2]

答案 4 :(得分:0)

另一个不需要numpy的选项是:

precision = 2  
myRoundedList = [int(elem*(10**precision)+delta)/(10.0**precision) for elem in myList]

# delta=0 for floor
# delta = 0.5 for round
# delta = 1 for ceil

答案 5 :(得分:0)

您可以将内置maplambda expression一起使用:

my_list = [0.2111111111, 0.5, 0.3777777777]
my_list_rounded = list(map(lambda x: round(x, ndigits=2), my_list))
my_list_rounded                                                                                                                                                                                                                 
Out[3]: [0.21, 0.5, 0.38]

或者,您还可以使用 partial模块中的functools创建用于向上舍入到特定数字的命名函数,以使用高阶函数

from functools import partial

my_list = [0.2111111111, 0.5, 0.3777777777]
round_2digits = partial(round, ndigits=2)
my_list_rounded = list(map(round_2digits, my_list))
my_list_rounded                                                                                                                                                                                                                 
Out[6]: [0.21, 0.5, 0.38]