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

Fis*_*ish 38 python

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

result = [359.70000000000005]
result = "%.2f" % result
result = [359.70]
Run Code Online (Sandbox Code Playgroud)

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

list = [0.30000000000000004, 0.5, 0.20000000000000001]
list = "%.2f" % list
TypeError: not all arguments converted during string formatting
Run Code Online (Sandbox Code Playgroud)

我怎样才能提供一个干净的清单,如:

list = [0.30, 0.5, 0.20]
Run Code Online (Sandbox Code Playgroud)

eum*_*iro 72

"%.2f"没有返回干净的浮子.它返回一个表示此float 的字符串,带有两位小数.

my_list = [0.30000000000000004, 0.5, 0.20000000000000001]
my_formatted_list = [ '%.2f' % elem for elem in my_list ]
Run Code Online (Sandbox Code Playgroud)

收益:

['0.30', '0.50', '0.20']
Run Code Online (Sandbox Code Playgroud)

另外,不要调用你的变量list.这是列表创建的保留字.例如,使用其他名称my_list.

如果你想获得[0.30, 0.5, 0.20](或至少是最接近的浮动),你可以试试这个:

my_rounded_list = [ round(elem, 2) for elem in my_list ]
Run Code Online (Sandbox Code Playgroud)

收益:

[0.29999999999999999, 0.5, 0.20000000000000001]
Run Code Online (Sandbox Code Playgroud)

  • 甚至比`myList`更好的是'my_list`来遵守PEP 8. (7认同)
  • @Darksky - Python中没有**float**`0.20`.最接近的是`0.20000000000000001`.但它的十进制表示有两位小数"0.20". (3认同)
  • "如果你想获得[0.30,0.5,0.20],试试这个:myRoundedList = [round(elem,2)for mym in myList]返回[0.29999999999999999,0.5,0.20000000000000001]".所以这段代码没有得到他想要获得的东西(你也明确了[0.30,0.5,0.20],只有两个小数点浮点数). (2认同)

joh*_*jik 15

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

import numpy as np
myList = list(np.around(np.array(myList),2))
Run Code Online (Sandbox Code Playgroud)

  • 这个。这个解决方案应该上升,其余的下降。 (2认同)

mar*_*eau 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]
Run Code Online (Sandbox Code Playgroud)


小智 5

mylist = [0.30000000000000004, 0.5, 0.20000000000000001]
myRoundedList =  [round(x,2) for x in mylist] 
# [0.3, 0.5, 0.2]
Run Code Online (Sandbox Code Playgroud)


joj*_*ojo 5

您可以将内置函数maplambda表达式一起使用:

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]
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)