2010-11-24 11 views
11

hvor puedo en pitón hacer lo siguiente redondeo:Python - Ronda a 05 más cercana

redonda con una precisión de 05 decimales

7,97 -> 7,95

6,72 -> 6,70

31,06 -> 31,05

36,04 -> 36,05

5,25 -> 5,25

Espero que tenga sentido.

+0

Me sorprende que ninguna de las respuestas que utilizan el número mágico '20 'molestarse en explicar por qué fue elegido. – martineau

+3

@martineau: lo pondré aquí para el registro en caso de que alguien no pueda resolverlo. '20 == 1/0.05' –

Respuesta

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

¡Muchas gracias! Eso es perfecto! – pkdkk

+0

'round_to_05 (-1)' da '-0.95' que no me parece el resultado correcto. –

+0

cierto, estaba pensando en números naturales ... Lo arreglaré. – fortran

12
def round05(number): 
    return (round(number * 20)/20) 

O de forma más genérica:

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

El único problema es because you're using floats you won't get exactly the answers you want:

>>> round_to_value(36.04,0.05) 
36.050000000000004 
+1

'decimal' es el nombre de un módulo en la biblioteca estándar de python, por lo que es posible que desee evitar el uso de ese nombre. – martineau

+0

@martineau - Tiene razón y es una mala reputación, ya que el segundo argumento no tiene que ser un decimal, también puede usar la función para redondear a números enteros, p. Ej. 'round_to_value (36.04,5)' da '35.0'. –

+0

+1 porque esta es actualmente la única respuesta que proporciona una solución generalizada (que, como es lógico, generalmente es mejor en mi humilde opinión). – martineau

2

ahí vamos.

round(VALUE*2.0, 1)/2.0 

respecto

+1

que se redondearía a la mitad, deberías multiplicar y dividir por 20 – fortran

2

Aquí hay un chiste

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

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] 
1

Para redondear el resultado a exactamente cómo usted desea:

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

Usando 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 
Cuestiones relacionadas