2011-03-16 33 views
23

我有一个由float值组成的列表,但它们太详细了,无法继续。我知道我们可以通过使用(“%.F”%变量)运算符就像缩短他们:如何将浮点列表中的每个项目四舍五入到小数点后两位?

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

我的问题是,我们又怎么能值的列表,而无需使用迭代器。

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] 

它可以是一个愚蠢的问题,因为我是新开工的Python。对不起。

+2

此处严重混淆了概念。例如'0.2'和'0.20000000000000001'是* same *双精度浮点数的表示。刚开始你的解释器并输入'0.2'来看看这个。 – 2011-03-16 13:40:17

回答

40

"%.2f"不返回一个干净浮动。它返回一个字符串,代表该浮点数,带两位小数。

myList = [0.30000000000000004, 0.5, 0.20000000000000001] 
myFormattedList = [ '%.2f' % elem for elem in myList ] 

回报:

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

另外,不要打电话给你的变量list。这是列表创建的保留字。使用其他名称,例如myList

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

myRoundedList = [ round(elem, 2) for elem in myList ] 

回报:

[0.29999999999999999, 0.5, 0.20000000000000001] 
+0

谢谢,eumiro。只是用“列表”来解释。 – Fish 2011-03-16 13:43:39

+6

甚至比'myList'更符合PEP 8'my_list'。 – 2011-03-16 13:46:05

+1

“如果您想获得[0.30,0.5,0.20],请尝试以下操作:myRoundedList = [myList中elem的round(elem,2)]返回[0.29999999999999999,0.5,0.20000000000000001]“。所以这段代码并没有获得他想要获得的东西(你明确表示[0.30,0.5,0.20],两个小数点只能浮点)。 – darksky 2013-01-26 18:13:05

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] 
相关问题