在元组中对数字进行四舍五入

12

有没有办法将元组中的数字四舍五入到小数点后两位,从这个开始:

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

变成这样:

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

非常感谢您的帮助。


2
这里有一个关于SO的相关帖子:https://dev59.com/1nRB5IYBdhLWcg3w9Lzn - pyfunc
3个回答

16
如果你的元组大小固定为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')

这是一个重复的问题。链接已经作为评论提供。最好只是指向它并将此问题标记为重复。 - pyfunc
3
我回答时那个链接还没有出现,问题可能也不同。也许他遇到的问题是处理元组,而不是浮点数运算本身引起的困难? - tux21b
3
@pyfunc 我不会说这是一个重复的问题。这个问题与原问题有关,但我认为@tux21b 发布的“通用解决方案”可能是楼主想要的。至少这是我的理解,即如何对包含其他类型值的元组中的浮点数/双精度数进行四舍五入处理。 - Davy8
1
@pyfunc:这是相关的问题,而不是重复的问题。原帖作者的问题可能是atuple[1] = round(atuple[1], 2)失败了,而在列表中却可以正常工作。一个新颖的想法是:试着问问原帖作者他真正的问题是什么。 - John Machin

3

列表推导式解决方案:

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

1
为了避免浮点数舍入误差问题,您可以使用{{link2: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 在调用 tuple 方法时使用了一个 生成器表达式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接