2010-07-29 9 views
6

Tengo dos variables: count, que es un número de mis objetos filtrados, y un valor constante por página. Quiero dividir recuento por per_page y obtener valor entero pero no importa lo que intento - que estoy recibiendo 0 o 0.0:Aritmética básica de Python - división

>>> 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é da Math.ceil número flotante en lugar de En t ?

+0

funciona cuando lo hago así: count = float (count), per_page = float (por página), pages = math.ceil (count/per_page) y finalmente pages = int (pages). Pero eso es un poco tonto. –

+0

Ver [ ¿Por qué esta división no funciona en python? ] (http://stackoverflow.com/questions/1787249/why-doesnt-this-division-work-in-python/). –

Respuesta

16

Python realiza la división de enteros cuando ambos operandos son enteros, lo que significa que 1/2 es básicamente "cuántas veces 2 entra a 1", lo que es, por supuesto, 0 veces. Para hacer lo que quiera, convierta un operando a un flotador: 1/float(2) == 0.5, como está esperando. Y, por supuesto, math.ceil(1/float(2)) dará 1, como usted espera.

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

6

La división entera es el valor por defecto del operador / en Python < 3.0. Esto tiene un comportamiento que parece un poco extraño. Devuelve el dividendo sin un resto.

>>> 10/3 
3 

Si se está utilizando Python 2.6+, Proveedores:

from __future__ import division 

>>> 10/3 
3.3333333333333335 

Si está ejecutando una versión anterior de Python que esto, tendrá que convertir al menos una de las numerador o denominador 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. 
+1

No ser selectivo, pero es el numerador, no el nominador =] – Falmarri

+0

Me perdí eso en los documentos que se centran en la parte 'entero': P gracias –

+0

Buen punto, se editará. ¡Gracias! –

0

Son enteros, por lo count/per_pages es cero antes de las funciones cada vez llegan a hacer nada más allá de eso. No soy un programador de Python realmente, pero sé que (count * 1.0)/pages hará lo que quiera. Sin embargo, es probable que haya una forma correcta de hacerlo.

editar — sí ven @ respuesta de mipadi y float(x)

+0

En lugar de multiplicar por 1.0 en todas partes, ¿por qué no utilizas 'from __future__ import division'? – dan04

+0

Podría hacer eso si supiera algo sobre Python :-) – Pointy

0

es porque la forma en que lo tienes configurado está realizando la operación y luego convertirlo en un flotador tratar

count = friends.count() 
print count 

per_page = float(2) 
print per_page 

pages = math.ceil(count/per_pages) 

print pages 
pages = count/per_pages 

Mediante la conversión ya sea contar o per_page a un flotador todas sus operaciones futuras deberían poder hacer divisiones y terminar con los números no enteros

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

La mejor solución es utilizar lo mejor from __future__ import division

Cuestiones relacionadas