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.
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.
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 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
'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
@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'. –
+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
ahí vamos.
round(VALUE*2.0, 1)/2.0
respecto
que se redondearía a la mitad, deberías multiplicar y dividir por 20 – fortran
Aquí hay un chiste
def roundto(number, multiple):
return number+multiple/2 - ((number+multiple/2) % multiple)
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]
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
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
Me sorprende que ninguna de las respuestas que utilizan el número mágico '20 'molestarse en explicar por qué fue elegido. – martineau
@martineau: lo pondré aquí para el registro en caso de que alguien no pueda resolverlo. '20 == 1/0.05' –