对元组中的数字进行向上取整

12 投票
3 回答
22875 浏览
提问于 2025-04-16 05:27

有没有办法把一个元组里的数字四舍五入到小数点后两位,从这个:

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

变成这个:

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

非常感谢!

3 个回答

1

为了避免出现浮点数四舍五入错误的问题,你可以使用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在调用元组时使用了生成器表达式

3

列表推导式的解决方案:

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

如果你的元组(tuple)大小固定为4,并且里面的浮点数(float)位置总是一样的,你可以这样做:

>>> 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')

撰写回答