2011-11-14 26 views
14

estoy corriendo en el problema siguiente:Python - Redondeo por cuartos de intervalos

dado varios números como:

10,38

11,12

5,24

9,76

existe una función ya 'incorporada' para redondear el m hasta el 0,25 paso más cerca, 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 juntos una función que realiza la tarea deseada?

Gracias de antemano y

con vistas mejores

Dan

Respuesta

24
>>> 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 
>>> 
+0

* head ---> desk * de hecho trivial - Dejaré de codificar a las 5am -.- gracias pulegium y 6502 – Daniyal

4

No hay orden interna, pero tal función es trivial para escribir

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

Ésta es una solución de propósito general que permite el redondeo a resoluciones arbitrarias. Para su caso específico, solo necesita 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) 

Este salidas:

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 
+0

una hermosa solución genérica. ¿Cómo puedo marcar todas las soluciones dadas como 'respuesta aceptada'? – Daniyal

+3

@Daniyal: no puedes. Mi comportamiento habitual, si las respuestas no se pueden ordenar por mérito, es otorgarlo (junto con un voto positivo) al hombre con el representante más bajo y también votar por los demás. En este caso, no soy yo, desafortunadamente :-) – paxdiablo

2

La solución de paxdiablo pueden ser un poco mejorado.

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

por lo que la función ahora es: "tipo de datos sensibles".