¿Existe una función incorporada que pueda redondear como la siguiente?
10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20
No sé de una función estándar en Python, pero esto funciona para mí:
def myround(x, base=5):
return int(base * round(float(x)/base))
def myround(x, base=5):
return base * round(x/base)
Es fácil ver por qué funciona lo anterior. Desea asegurarse de que su número dividido entre 5 sea un número entero, correctamente redondeado. Entonces, primero hacemos exactamente eso ( round(float(x)/5)
donde float
solo se necesita en Python2), y luego, dado que dividimos entre 5, también multiplicamos por 5. La conversión final a int
es porque round()
devuelve un valor de punto flotante en Python 2.
Hice la función más genérica dándole un base
parámetro, por defecto a 5.
x // base * base
floor()
yceil()
no usarlo :base * floor(x/base)
math.floor
ymath.ceil
no permite su uso con una base personalizada, por lo que la preferencia es irrelevante.Para redondear a valores no enteros, como 0.05:
Encontré esto útil ya que podía hacer una búsqueda y reemplazar en mi código para cambiar "round (" a "myround (", sin tener que cambiar los valores de los parámetros.
fuente
def my_round(x, prec=2, base=0.05): return (base * (np.array(x) / base).round()).round(prec)
que acepta matrices numpy también.Es solo cuestión de escalar
fuente
Eliminar el 'descanso' funcionaría:
Si el valor es ya un entero:
Como una función:
fuente
fuente
round (x [, n]): los valores se redondean al múltiplo más cercano de 10 a la potencia menos n. Entonces, si n es negativo ...
Como 10 = 5 * 2, puede usar la división entera y la multiplicación con 2, en lugar de la división flotante y la multiplicación con 5.0. No es que eso importe mucho, a menos que te guste un poco de desplazamiento
fuente
Lo siento, quería comentar la respuesta de Alok Singhai, pero no me lo permite debido a la falta de reputación = /
De todos modos, podemos generalizar un paso más e ir:
Esto nos permite usar bases no enteras, como
.25
o cualquier otra base fraccional.fuente
Versión modificada de divround :-)
fuente
Utilizar:
No usa multiplicación y no convertirá de / a flotantes.
Redondeando al múltiplo de 10 más cercano:
Como puede ver, funciona tanto para números negativos como positivos. Los empates (por ejemplo, -15 y 15) siempre se redondearán hacia arriba.
Un ejemplo similar que se redondea al múltiplo más cercano de 5, lo que demuestra que también se comporta como se espera para una "base" diferente:
fuente
En caso de que alguien necesite "redondeo financiero" (0.5 rondas siempre arriba):
Según la documentación, otras opciones de redondeo son:
Por defecto, Python usa ROUND_HALF_EVEN ya que tiene algunas ventajas estadísticas (los resultados redondeados no están sesgados).
fuente
Para enteros y con Python 3:
Productor:
fuente
¿Qué hay de esto?
fuente
Siguiente múltiplo de 5
Considere que 51 necesita convertirse a 55:
fuente
Aquí está mi código C. Si lo entiendo correctamente, debería ser algo como esto;
y esto también se redondea al múltiplo más cercano de 5 en lugar de simplemente redondear hacia arriba;
fuente
Otra forma de hacer esto (sin operadores explícitos de multiplicación o división):
fuente
Puede "engañar"
int()
para redondear en lugar de redondear hacia abajo agregando0.5
al número al que pasaint()
.fuente