2010-07-29 3 views
6

Ho due variabili: count, che è un numero di oggetti filtrati e valore costante per_page. Voglio dividere conteggio da per_page e ottenere valore intero, ma io non importa quello che cerco - sto ottenendo 0 o 0.0:Aritmetica python di base - divisione

>>> 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 

Che cosa sto facendo di sbagliato, e perché Math.ceil dà il numero float invece di int?

+0

funziona quando lo faccio in questo modo: count = float (count), per_page = float (per_page), pages = math.ceil (count/per_page) e infine pages = int (pagine). Ma questo è un modo un po 'stupido. –

+0

Vedere [ Perché questa divisione non funziona in python? ] (http://stackoverflow.com/questions/1787249/why-doesnt-this-division-work-in-python/). –

risposta

16

Python esegue la divisione intera quando entrambi gli operandi sono interi, ovvero 1/2 è sostanzialmente "quante volte 2 entra in 1", che è ovviamente 0 volte. Per fare ciò che vuoi, converti un operando in un float: 1/float(2) == 0.5, come ti aspetti. E, naturalmente, math.ceil(1/float(2)) produrrà 1, come previsto.

(credo che questo comportamento divisione cambia in Python 3.)

6

divisione Integer è l'impostazione predefinita dell'operatore / in Python < 3.0. Questo ha un comportamento che sembra un po 'strano. Restituisce il dividendo senza resto.

>>> 10/3 
3 

Se si sta eseguendo Python 2.6+, provare:

from __future__ import division 

>>> 10/3 
3.3333333333333335 

Se si sta eseguendo una versione inferiore di Python di questo, è necessario convertire almeno uno del numeratore o denominatore ad un galleggiante:

>>> 10/float(3) 
3.3333333333333335 

Inoltre, Math.ceil sempre restituisce un galleggiante ...

>>> import math 
>>> help(math.ceil) 

ceil(...) 
    ceil(x) 

    Return the ceiling of x as a float. 
    This is the smallest integral value >= x. 
+1

Non essere schizzinoso, ma è il numeratore, non il nominatore =] – Falmarri

+0

Ho mancato che nei documenti che si concentrano sulla parte 'integer': P grazie –

+0

Un buon punto, verrà modificato. Grazie! –

0

Sono numeri interi, quindi count/per_pages è zero prima che le funzioni riescano a fare qualcosa oltre a questo. Non sono un programmatore Python ma so che lo (count * 1.0)/pages farà quello che vuoi. Probabilmente c'è un modo giusto per farlo.

modificare — sì vedere @ risposta di mipadi e float(x)

+0

Invece di moltiplicare per 1.0 ovunque, perché non usi semplicemente "da __future__ import division"? – dan04

+0

Potrei fare proprio questo se sapessi qualcosa su Python :-) – Pointy

0

suo perché come lo avete impostato sta eseguendo l'operazione e quindi convertirlo in un galleggiante provare

count = friends.count() 
print count 

per_page = float(2) 
print per_page 

pages = math.ceil(count/per_pages) 

print pages 
pages = count/per_pages 

Con la conversione sia conteggio o per_page ad un galleggiante tutte le sue operazioni future dovrebbe essere in grado a fare le divisioni e finire con i numeri non interi

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 soluzione migliore forse è quella di utilizzare from __future__ import division