2010-10-13 59 views
1

内有反正我可以一个元组内围捕号码两个小数点, 从这个:凑整数字的元组

('string 1', 1234.55555, 5.66666, 'string2') 

这样:

('string 1', 1234.56, 5.67, 'string2') 

非常感谢提前。

+2

SO上有相关线程:http://stackoverflow.com/questions/455612/python-limiting-floats-to-two-decimal-points – pyfunc 2010-10-13 22:33:57

回答

5

如果你的元组有4固定的大小和彩车的位置总是一样的,你可以这样做:

>>> t = ('string 1', 1234.55555, 5.66666, 'string2') 
>>> t2 = (t[0], round(t[1], 2), round(t[2], 2), t[3]) 
>>> t2 
('string 1', 1234.56, 5.67, 'string2') 

一般的解决办法是:

>>> t2 = tuple(map(lambda x: isinstance(x, float) and round(x, 2) or x, t)) 
>>> t2 
('string 1', 1234.56, 5.67, 'string2') 
+0

这是重复的。该链接已作为评论提供。指出它并将此问题标记为重复会更好。 – pyfunc 2010-10-13 22:36:59

+2

当我编写答案时,链接不在那里,问题可能会有所不同。也许他有麻烦处理元组,而不是一般的浮点算术? – tux21b 2010-10-13 22:41:20

+2

@pyfunc我不会说这是重复的。这是相关的,但我认为@ tux21b发布的“通用解决方案”是OP可能试图解决的问题。至少我是这么理解的,如何在包含其他类型的其他值的元组中使用浮点/双精度。 – Davy8 2010-10-13 22:43:55

1

名单理解的解决方案:

t = ('string 1', 1234.55555, 5.66666, 'string2') 
solution = tuple([round(x,2) if isinstance(x, float) else x for x in t]) 
0

为了避免issues with floating-point rounding errors,您可以使用decimal.Decimal个对象:

""" 
>>> rounded_tuple(('string 1', 1234.55555, 5.66666, 'string2')) 
('string 1', Decimal('1234.56'), Decimal('5.67'), 'string2') 
""" 
from decimal import Decimal 
def round_if_float(value): 
    if isinstance(value, float): 
     return Decimal(str(value)).quantize(Decimal('1.00')) 
    else: 
     return value 

def rounded_tuple(tup): 
    return tuple(round_if_float(value) for value in tup) 

rounded_tuple使用generator expression调用元组内。