2010-10-13 6 views
1

Y at-il de toute façon je pourrais les chiffres ronds-up dans un tuple à deux chiffres après la virgule, de cette:nombre arrondi au sein d'un tuple

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

à cette:

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

Un grand merci en avance.

+2

Il ya un fil connexe sur SO: http://stackoverflow.com/questions/455612/python-limiting-floats-to-two-decimal-points – pyfunc

Répondre

5

Si votre tuple a une taille fixe de 4 et la position des flotteurs est toujours le même, vous pouvez le faire:

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

La solution générale serait:

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

Ceci est un doublon. Le lien a été fourni en commentaire. Il vaudrait mieux le pointer et marquer cette question comme doublon. – pyfunc

+2

Le lien n'était pas là quand j'ai écrit ma réponse, et les questions pourraient être différentes. Peut-être qu'il a des problèmes pour gérer le tuple et pas avec l'arithmétique en virgule flottante en général? – tux21b

+2

@pyfunc Je ne dirais pas que c'est un doublon. C'est lié mais je pense que la "solution générale" publiée par @ tux21b est ce que le PO peut essayer d'obtenir. Au moins c'est comme ça que je le comprends, comment arrondir des flottants/doubles dans un tuple qui contient d'autres valeurs d'autres types. – Davy8

1

Liste solution de compréhension:

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

Pour éviter issues with floating-point rounding errors, vous pouvez utiliser decimal.Decimal objets:

""" 
>>> 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 utilise un generator expression dans un appel à tuple.