Python – Redondea al 05 más cercano

Hvor puedo hacer en python el siguiente redondeo:

Redondea al 05 decimal más cercano

7,97 -> 7,95

6,72 -> 6,70

31,06 -> 31,05

36,04 -> 36,05

5,25 -> 5,25

Espero que tenga sentido.

 def round_to(n, precision): correction = 0.5 if n >= 0 else -0.5 return int( n/precision+correction ) * precision def round_to_05(n): return round_to(n, 0.05) 
 def round05(number): return (round(number * 20) / 20) 

O más genéricamente:

 def round_to_value(number,roundto): return (round(number / roundto) * roundto) 

El único problema es que si estás usando flotadores, no obtendrás exactamente las respuestas que deseas :

 >>> round_to_value(36.04,0.05) 36.050000000000004 

Aquí vamos.

 round(VALUE*2.0, 1) / 2.0 

Saludos

Usando la función lambda:

 >>> nearest_half = lambda x: round(x * 2) / 2 >>> nearest_half(5.2) 5.0 >>> nearest_half(5.25) 5.5 >>> nearest_half(5.26) 5.5 >>> nearest_half(5.5) 5.5 >>> nearest_half(5.75) 6.0 

Aquí hay un trazador de líneas

 def roundto(number, multiple): return number+multiple/2 - ((number+multiple/2) % multiple) 

Para redondearlo exactamente a cómo quieres:

 >>> def foo(x, base=0.05): ... return round(base*round(x/base), 2) >>> foo(5.75) 5.75 >>> foo(5.775) 5.8 >>> foo(5.77) 5.75 >>> foo(7.97) 7.95 >>> foo(6.72) 6.7 >>> foo(31.06) 31.05 >>> foo(36.04) 36.05 >>> foo(5.25) 5.25 

Una extensión de la respuesta aceptada.

 def round_to(n, precision): correction = precision if n >= 0 else -precision return round(int(n/precision+correction)*precision, len(str(precision).split('.')[1])) test_cases = [101.001, 101.002, 101.003, 101.004, 101.005, 101.006, 101.007, 101.008, 101.009] [round_to(-x, 0.003) for x in test_cases] [-101.001, -101.001, -101.001, -101.004, -101.004, -101.004, -101.007, -101.007, -101.007]