Aritmética básica de Python – División

Tengo dos variables: recuento, que es un número de mis objetos filtrados, y valor constante por página. Quiero dividir la cuenta por per_page y obtener un valor entero, pero no importa lo que intente, obtengo 0 o 0.0

>>> count = friends.count() >>> print count 1 >>> per_page = 2 >>> print per_page 2 >>> pages = math.ceil(count/per_pages) >>> print pages 0.0 >>> pages = float(count/per_pages) >>> print pages 0.0 

¿Qué estoy haciendo mal y por qué math.ceil da un número flotante en lugar de int?

Python hace división de enteros cuando ambos operandos son enteros, lo que significa que 1 / 2 es básicamente “cuántas veces 2 entra 1”, que por supuesto es 0 veces. Para hacer lo que quiera, convierta un operando en un flotante: 1 / float(2) == 0.5 , como espera. Y, por supuesto, math.ceil(1 / float(2)) producirá 1 , como espera.

(Creo que este comportamiento de división cambia en Python 3.)

La división entera es el valor predeterminado del operador / en Python <3.0. Esto tiene un comportamiento que parece un poco raro. Devuelve el dividendo sin residuo.

 >>> 10 / 3 3 

Si está ejecutando Python 2.6+, intente:

 from __future__ import division >>> 10 / 3 3.3333333333333335 

Si está ejecutando una versión de Python inferior a esta, deberá convertir al menos uno de los numeradores o denominadores a un flotador:

 >>> 10 / float(3) 3.3333333333333335 

Además, math.ceil siempre devuelve un flotador …

 >>> import math >>> help(math.ceil) ceil(...) ceil(x) Return the ceiling of x as a float. This is the smallest integral value >= x. 

Son enteros, por lo que count/per_pages es cero antes de que las funciones lleguen a hacer algo más allá de eso. No soy un progtwigdor de Python realmente, pero sé que (count * 1.0) / pages hará lo que quieras. Sin embargo, probablemente hay una forma correcta de hacerlo.

editar – sí ver la respuesta de @ mipadi y float(x)

Es porque la forma en que lo has configurado es realizar la operación y luego convertirla en un bash de flotación

 count = friends.count() print count per_page = float(2) print per_page pages = math.ceil(count/per_pages) print pages pages = count/per_pages 

Al convertir el recuento o por página en un flotador, todas sus operaciones futuras deberían ser capaces de hacer divisiones y terminar con números no completos

 >>> 10 / float(3) 3.3333333333333335 >>> #Or >>> 10 / 3.0 3.3333333333333335 >>> #Python make any decimal number to float >>> a = 3 >>> type(a)  >>> b = 3.0 >>> type(b)  >>> 

La mejor solución tal vez sea utilizar la from __future__ import division

De la documentación de Python (módulo matemático) :

math.ceil(x)

Devuelva el techo de x como un flotador, el valor entero más pequeño mayor o igual que x.