Базовая арифметика с питоном - деление - PullRequest
6 голосов
/ 30 июля 2010

У меня есть две переменные: count, который является числом моих отфильтрованных объектов, и постоянное значение per_page.Я хочу разделить счетчик на per_page и получить целочисленное значение, но неважно, что я пытаюсь - я получаю 0 или 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

Что я делаю неправильно и почему math.ceil дает число с плавающей запятойвместо int?

Ответы [ 6 ]

16 голосов
/ 30 июля 2010

Python выполняет целочисленное деление, когда оба операнда являются целыми числами. Это означает, что 1 / 2 в основном означает «сколько раз 2 переходит в 1», что, конечно, 0 раз. Чтобы сделать то, что вы хотите, конвертируйте один операнд в число с плавающей точкой: 1 / float(2) == 0.5, как вы ожидаете. И, конечно же, math.ceil(1 / float(2)) даст 1, как вы ожидаете.

(Я думаю, что это поведение деления меняется в Python 3.)

6 голосов
/ 30 июля 2010

Целочисленное деление является значением по умолчанию оператора / в Python <3.0.Такое поведение кажется немного странным.Возвращает дивиденд без остатка.</p>

>>> 10 / 3
3

Если вы используете Python 2.6+, попробуйте:

from __future__ import division

>>> 10 / 3
3.3333333333333335

Если вы используете более низкую версию Python, чем эта, вам нужно будет конвертировать хотя бы одинчислителя или знаменателя для числа с плавающей запятой:

>>> 10 / float(3)
3.3333333333333335

Кроме того, math.ceil всегда возвращает число с плавающей запятой ...

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

ceil(...)
    ceil(x)

    Return the ceiling of x as a float.
    This is the smallest integral value >= x.
0 голосов
/ 30 июля 2010
>>> 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

0 голосов
/ 30 июля 2010

потому что, как вы настроили, выполняет операцию, а затем конвертирует ее в float try

count = friends.count()
print count

per_page = float(2)
print per_page

pages = math.ceil(count/per_pages)

print pages
pages = count/per_pages

Путем преобразования количества или per_page в число с плавающей точкой все его будущие операции должны иметь возможность деления и заканчиваться не целыми числами

0 голосов
/ 30 июля 2010

С Документация Python (математический модуль) :

math.ceil(x)

Возвращает верхний предел x в виде числа с плавающей точкой, наименьшее целочисленное значение, большее или равное x.

0 голосов
/ 30 июля 2010

Они являются целыми числами, поэтому count/per_pages равно нулю, прежде чем функции когда-либо смогут что-то сделать помимо этого.Я не программист на Python, но знаю, что (count * 1.0) / pages будет делать то, что вы хотите.Однако, вероятно, есть правильный способ сделать это.

edit - да, смотрите ответ @ mipadi и float(x)

...