Este problema me está matando. ¿Cómo se acumula un número UP en Python?
Intenté redondear (número) pero redondeó el número hacia abajo. Ejemplo:
round(2.3) = 2.0 and not 3, what I would like
¡Intenté int (número + .5) pero redondea el número nuevamente! Ejemplo:
int(2.3 + .5) = 2
Luego intenté round (número + .5) pero no funcionará en casos extremos. Ejemplo:
WAIT! THIS WORKED!
Por favor avise.
python
floating-point
integer
rounding
python-2.x
bodacydo
fuente
fuente
round(number + .5)
no funciona si el número es entero.round(3+.5) == 4
, cuando realmente quieres3
.Respuestas:
El ceil función (techo):
fuente
int(math.ceil(363))
math.ceil
devuelve un objeto entero real, no solo un objeto flotante con valor entero.10000000 * 0.00136 = 13600.000000000002
techo puede aumentar muchomath.ceil(10000000 * 0.00136) = 13601.0
Sé que esta respuesta es para una pregunta de hace un tiempo, pero si no quieres importar matemáticas y solo quieres redondear, esto funciona para mí.
La primera parte se convierte en 4 y la segunda parte se evalúa como "Verdadero" si hay un resto, que además es Verdadero = 1; False = 0. Entonces, si no hay resto, entonces permanece el mismo número entero, pero si hay un resto agrega 1.
fuente
//
para la división de enteros, por lo que esto se convierte21 // 5 + (21 % 5 > 0)
.float
s. Agradable.Interesante tema de Python 2.x a tener en cuenta:
El problema es que dividir dos entradas en python produce otro int y se trunca antes de la llamada al techo. Tienes que hacer que un valor sea flotante (o lanzado) para obtener un resultado correcto.
En javascript, el mismo código exacto produce un resultado diferente:
fuente
Si trabaja con números enteros, una forma de redondear es aprovechar el hecho de que se
//
redondea hacia abajo: simplemente haga la división en el número negativo y luego niegue la respuesta. No se necesita importación, coma flotante ni condicional.Por ejemplo:
fuente
(num + den - 1) // den
, lo cual está bien paraint
entradas con denominadores positivos, pero falla si inclusofloat
está involucrado un solo no integral (numerador o denominador); Esto tiene un aspecto más mágico, pero funciona tanto paraint
s como parafloat
s. Para numeradores pequeños, también es más rápido (en CPython 3.7.2), aunque curiosamente, cuando solo el numerador es lo suficientemente grande como para que se necesiten matemáticas basadas en matrices, su enfoque es más lento; No está claro por qué esto es así, ya que el trabajo de división debería ser similar y dos negaciones unitarias deberían ser más baratas que la suma + resta.También te puede interesar numpy:
No digo que sea mejor que las matemáticas, pero si ya estabas usando numpy para otros fines, puedes mantener tu código consistente.
De todos modos, solo un detalle que encontré. Uso mucho numpy y me sorprendió que no se mencionara, pero, por supuesto, la respuesta aceptada funciona perfectamente bien.
fuente
Use
math.ceil
para redondear:NOTA : La entrada debe ser flotante.
Si necesita un número entero, llame
int
para convertirlo:Por cierto, use
math.floor
para redondear hacia abajo yround
para redondear al entero más cercano.fuente
ceil()
se encargará de ello internamenteLa sintaxis puede no ser tan pitónica como uno quisiera, pero es una biblioteca poderosa.
https://docs.python.org/2/library/decimal.html
fuente
Me sorprende que nadie sugirió
para división entera con redondeo. Solía ser la forma común de C / C ++ / CUDA (cf.
divup
)fuente
1
lugar de restarlo, o cambiar los signos de numerador y denominador antes de realizar las matemáticas.El valor redondeado debe ser flotante
pero
fuente
Prueba esto:
fuente
((int(a) - a) != 0)
expresión vuelve1
siempre que seaa
necesario redondearla. Es posible que desee ampliar su respuesta y explicar cómo funciona esto.Esta función no requiere módulos.
fuente
3
, entonces sería redondear hasta4
que puede o no ser lo que alguien quiereLas respuestas anteriores son correctas, sin embargo, importar el
math
módulo solo para esta función generalmente me parece un poco exagerado. Afortunadamente, hay otra forma de hacerlo:True
yFalse
se interpretan como1
y0
en una declaración que involucra números en python.g.is_interger()
Básicamente se traduce comog.has_no_decimal()
og == int(g)
. Entonces se lee la última declaración en inglésround g down and add one if g has decimal
.fuente
int(g) + (g % 1 > 0)
en su lugar ;-)from math import ceil
parece solucionar la importación del módulo matemático completo :)import math
en términos de lo que sucede detrás de escena. Simplemente deja caer todos los símbolos exceptoceil
.Sin importar matemáticas // usando el entorno básico:
a) método / método de clase
b) lambda:
fuente
Para aquellos que quieren redondear
a / b
y obtener un número entero:Otra variante que usa la división de enteros es
fuente
En caso de que alguien esté buscando redondear a un lugar decimal específico:
fuente
Me sorprende no haber visto esta respuesta todavía
round(x + 0.4999)
, así que la voy a dejar. Tenga en cuenta que esto funciona con cualquier versión de Python. Los cambios realizados en el esquema de redondeo de Python han dificultado las cosas. Ver esta publicación .Sin importar, uso:
Por que esto funciona
De los documentos
Por lo tanto, 2.5 se redondea a 2 y 3.5 se redondea a 4. Si este no fuera el caso, entonces se podría redondear agregando 0.5, pero queremos evitar llegar al punto medio. Entonces, si agrega 0.4999, se acercará, pero con un margen suficiente para redondear a lo que normalmente esperaría. Por supuesto, esto fallará si
x + 0.4999
es igual a[n].5000
, pero eso es poco probable.fuente
math.ceil()
?Without importing I use:
. También he mencionado que fallará six + 0.4999
es igual a[n].5000
.math
módulo ymath.ceil()
está en la biblioteca estándar, por lo que está disponible en todas partes para todos los fines prácticos sin instalar material adicional. Y con respecto a su mención de cuándo falla, esto está incompleto en su respuesta, ya que falla durante un intervalo completo, no solo por un solo punto. Técnicamente, podría argumentar que está en lo correcto, como dice si y no si , pero causará la impresión en el lector casual de que es menos probable de lo que realmente es.Para hacerlo sin importar nada:
fuente
Sé que esto fue hace bastante tiempo, pero encontré una respuesta bastante interesante, así que aquí va:
Esto soluciona los casos de bordes y funciona tanto para números positivos como negativos, y no requiere ninguna función de importación
Salud
fuente
-round(-x-0.3) = x
cuando opera 4500/1000 en python, el resultado será 4, porque para python predeterminado se asume como entero el resultado, lógicamente: 4500/1000 = 4.5 -> int (4.5) = 4 y el límite de 4 obviamente es 4
usando 4500 / 1000.0, el resultado será 4.5 y un techo de 4.5 -> 5
Al usar JavaScript, recibirá 4.5 como resultado de 4500/1000, porque JavaScript solo asume el resultado como "tipo numérico" y devuelve un resultado directamente como flotante
¡¡Buena suerte!!
fuente
/
siempre resulta en un flotante, por4500/1000
lo que siempre es 4.5.Si no desea importar nada, siempre puede escribir su propia función simple como:
def RoundUP(num): if num== int(num): return num return int(num + 1)
fuente
Puede usar el diseño del piso y agregarle 1. 2,3 // 2 + 1
fuente
ceil()
lugar de hacer extrañamente lo contrario y luego compensarfrom math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
Creo que estás confundiendo los mecanismos de trabajo entre
int()
yround()
.int()
siempre trunca los números decimales si se da un número flotante; mientras queround()
, en el caso de2.5
dónde2
y3
ambos están a la misma distancia2.5
, Python devuelve el que esté más alejado del punto 0.fuente
2.3
se convierte en3
, lo que sucede en ninguno de sus ejemplos.Mi parte
He probado
print(-(-101 // 5)) = 21
ejemplo anterior.Ahora para redondear:
No puedo usar,
**
así que extendí la multiplicación a la división:fuente
Básicamente soy un principiante en Python, pero si solo estás intentando redondear en lugar de bajar, ¿por qué no hacerlo?
fuente
round(integer + 0.5)
esto es lo que hago a menudo