2010-07-29 35 views
6

我有兩個變量:count,這是我的過濾對象的數量,以及per_page的常量值。我想per_page分裂計數並獲得整數值,但我不管我怎麼努力 - 我得到0或0.0:基本的Python算術 - 分區

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

我在做什麼錯,爲什麼math.ceil給浮點數,而不是int?

+0

它可以工作,當我這樣做時:count = float(count),per_page = float(per_page),pages = math。ceil(count/per_page),最後pages = int(pages)。但這有點愚蠢。 – 2010-07-29 22:07:30

+0

請參閱[ 爲什麼不在Python中工作? ](http://stackoverflow.com/questions/1787249/why-doesnt-this-division-work-in-python/)。 – 2010-07-29 22:14:29

回答

16

當兩個操作數都是整數時,Python會進行整數除法,這意味着1/2基本上是「多少次2進入1」,這當然是0次。要做你想做的事,把一個操作數轉換成一個浮點數:1/float(2) == 0.5,就像你期待的那樣。而且,當然,如您所料,math.ceil(1/float(2))將產生1

(我想在Python 3.這個師行爲更改)

6

整數除法是/運營商在Python < 3.0默認。這具有似乎有點奇怪的行爲。它返回股息而不剩餘。

>>> 10/3 
3 

如果你正在運行的Python 2.6+,請嘗試:

from __future__ import division 

>>> 10/3 
3.3333333333333335 

如果你正在運行一個比這更低版本的Python,您將需要分子中的至少一個或轉換分母爲float:

>>> 10/float(3) 
3.3333333333333335 

此外,math.ceil 總是返回一個float ...

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

ceil(...) 
    ceil(x) 

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

不挑剔,但它是分子,而不是分子=] – Falmarri 2010-07-29 22:28:27

+0

我錯過了專注於'整數'部分的文檔:P感謝 – 2010-07-29 22:41:08

+0

好點,會編輯。謝謝! – 2010-07-29 22:41:43

0

它們是整數,因此count/per_pages在函數做任何事之前都是零。我真的不是一個Python程序員,但我知道(count * 1.0)/pages會做你想做的。然而,可能有正確的方法。

編輯 —是看到@ mipadi的答案和float(x)

+0

而不是在任何地方乘以1.0,爲什麼不使用'from __future__ import division'? – dan04 2010-08-04 13:44:26

+0

我可能會這樣做,如果我對Python有什麼瞭解:-) – Pointy 2010-08-04 13:52:16

0

它,因爲你怎麼把它設置在執行操作,然後將其轉換爲浮動嘗試

count = friends.count() 
print count 

per_page = float(2) 
print per_page 

pages = math.ceil(count/per_pages) 

print pages 
pages = count/per_pages 

通過轉換count或per_page爲float將來所有的操作都應該能夠做部門和非整數

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

最好的解決辦法可能是使用結束from __future__ import division