Python – Redondeo por intervalos de un cuarto

Me estoy topando con el siguiente problema:

Dados varios números como:

10.38

11.12

5.24

9.76

¿existe una función ya ‘incorporada’ para redondearlos hasta el paso más cercano de 0.25 como por ejemplo:

10.38 -> 10.50

11.12 -> 11.00

5.24 -> 5.25

9.76 -> 9-75?

¿O puedo seguir adelante y hackear una función que realice la tarea deseada?

Gracias de antemano y

con los mejores deseos

Dan

>>> def my_round(x): ... return round(x*4)/4 ... >>> >>> assert my_round(10.38) == 10.50 >>> assert my_round(11.12) == 11.00 >>> assert my_round(5.24) == 5.25 >>> assert my_round(9.76) == 9.75 >>> 

Esta es una solución de propósito general que permite redondear a resoluciones arbitrarias. Para su caso específico, solo debe proporcionar 0.25 como resolución, pero otros valores son posibles, como se muestra en los casos de prueba.

 def roundPartial (value, resolution): return round (value / resolution) * resolution print "Rounding to quarters" print roundPartial (10.38, 0.25) print roundPartial (11.12, 0.25) print roundPartial (5.24, 0.25) print roundPartial (9.76, 0.25) print "Rounding to tenths" print roundPartial (9.74, 0.1) print roundPartial (9.75, 0.1) print roundPartial (9.76, 0.1) print "Rounding to hundreds" print roundPartial (987654321, 100) 

Esto produce:

 Rounding to quarters 10.5 11.0 5.25 9.75 Rounding to tenths 9.7 9.8 9.8 Rounding to hundreds 987654300.0 

No hay una función incorporada, pero tal función es trivial para escribir

 def roundQuarter(x): return round(x * 4) / 4.0 

La solución de paxdiablo se puede mejorar un poco.

 def roundPartial (value, resolution): return round (value /float(resolution)) * resolution 

entonces la función es ahora: “sensible al tipo de datos”.