2010-07-29 37 views
6

Tôi có hai biến: đếm, là một số đối tượng được lọc của tôi và giá trị hằng số per_page. Tôi muốn chia count bởi per_page và nhận được giá trị số nguyên nhưng tôi không có vấn đề gì tôi cố gắng - Tôi nhận được 0 hoặc 0.0:Số học python cơ bản - phân chia

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

Tôi đang làm gì sai, và tại sao Math.ceil cho số float thay vì int?

+0

nó hoạt động khi tôi làm như thế này: count = float (count), per_page = float (per_page), pages = math.ceil (đếm/per_page) và cuối cùng là trang = int (trang). Nhưng đó là một cách hơi câm. –

+0

Xem [ Tại sao bộ phận này không hoạt động trong python? ] (http://stackoverflow.com/questions/1787249/why-doesnt-this-division-work-in-python/). –

Trả lời

16

Python phân chia số nguyên khi cả hai toán hạng là số nguyên, nghĩa là 1/2 về cơ bản là "bao nhiêu lần 2 đi vào 1", tất nhiên là 0 lần. Để thực hiện những gì bạn muốn, chuyển đổi một toán hạng thành một phao: 1/float(2) == 0.5, như bạn mong đợi. Và, tất nhiên, math.ceil(1/float(2)) sẽ mang lại 1, như bạn mong đợi.

(Tôi nghĩ rằng hành vi phân chia này thay đổi bằng Python 3.)

6

phận Integer là mặc định của người điều khiển / bằng Python < 3.0. Điều này có hành vi có vẻ hơi lạ. Nó trả về cổ tức mà không có phần còn lại.

>>> 10/3 
3 

Nếu bạn đang chạy Python 2.6+, hãy thử:

from __future__ import division 

>>> 10/3 
3.3333333333333335 

Nếu bạn đang chạy một phiên bản thấp hơn của Python hơn này, bạn sẽ cần phải chuyển đổi ít nhất một trong những tử số hoặc mẫu số một float:

>>> 10/float(3) 
3.3333333333333335 

Ngoài ra, Math.ceil luôn trả về một phao ...

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

ceil(...) 
    ceil(x) 

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

Không phải là cầu kỳ, nhưng đó là tử số, không phải đề cử =] – Falmarri

+0

Tôi đã bỏ lỡ trong tài liệu tập trung vào phần 'số nguyên': P cảm ơn –

+0

Điểm tốt, sẽ chỉnh sửa. Cảm ơn! –

0

Chúng là số nguyên, vì vậy count/per_pages bằng 0 trước khi các chức năng bao giờ có thể làm bất cứ điều gì ngoài điều đó. Tôi không phải là một lập trình viên Python thực sự nhưng tôi biết rằng (count * 1.0)/pages sẽ làm những gì bạn muốn. Có lẽ một cách đúng đắn để làm điều đó tuy nhiên.

chỉnh sửa — có thấy @ câu trả lời mipadi và float(x)

+0

Thay vì nhân với 1.0 ở khắp mọi nơi, tại sao bạn không chỉ sử dụng 'từ __future__ bộ phận nhập khẩu'? – dan04

+0

Tôi có thể làm điều đó nếu tôi biết bất cứ điều gì ở tất cả về Python :-) – Pointy

0

của nó bởi vì làm thế nào bạn có nó thiết lập được thực hiện hoạt động và sau đó chuyển đổi nó vào một phao thử

count = friends.count() 
print count 

per_page = float(2) 
print per_page 

pages = math.ceil(count/per_pages) 

print pages 
pages = count/per_pages 

Bằng cách chuyển đổi hoặc đếm hoặc per_page đến một phao tất cả các hoạt động trong tương lai sẽ có thể để làm chia rẽ và kết thúc với không số nguyên

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

giải pháp tốt nhất có lẽ là sử dụng from __future__ import division

Các vấn đề liên quan