Отрицательное целочисленное деление удивительный результат - PullRequest
40 голосов
/ 04 апреля 2011

В моем приложении я обнаружил следующее и был удивлен результатами:

8/-7=-2 (оба целых числа).

что это значит?

Ответы [ 5 ]

45 голосов
/ 04 апреля 2011

Для фактических значений, т.е. 8.0/(-7.0), результат примерно равен -1.143.

Ваш результат с использованием целочисленного деления округляется в меньшую сторону до более отрицательного значения -2. (Это также известно как «Отделение пола»)

Вот почему вы получите несколько озадачивающие ответы:

>>> 8/(-7)
-2
>>> 8/7
1

Примечание: Это "исправлено" в Python 3, где результат 8/(-7) будет -1.143. Так что если у вас нет причин использовать Python 2, вы должны обновить. ;)

В Python 3, если вам все еще нужно целочисленное деление, вы можете использовать оператор //. Это даст вам тот же ответ, что и 8/(-7) в Python 2.

Вот предложение по улучшению Python на эту тему: PEP 238 - Изменение оператора деления

9 голосов
/ 20 июля 2015

Python всегда делает "деление по полу" как для деления отрицательных чисел, так и для деления положительных чисел.

То есть

1/10 = 0
1/-10 = -1

Но иногда нам нужно 1 / -10, чтобы быть 0

Я выяснил, что это можно сделать, используя сначала деление с плавающей точкой, затем приведя результат к int, например,

int(float(1)/-10) = 0

Это прекрасно работает для меня, нет необходимости импортировать будущее подразделение или обновить до Python 3

Надеюсь, это поможет вам ~

9 голосов
/ 04 апреля 2011

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

from __future__ import division

сейчас:

8/-7=-1.1428571428571428

эта функция отсутствует в стандартном Python 2, чтобы не нарушать существующиекод, который полагался на целочисленное деление.Тем не менее, это поведение по умолчанию для Python 3.

4 голосов
/ 04 апреля 2011

Когда оба значения являются целыми числами при делении, Python использует деление Пола.

0 голосов
/ 04 апреля 2011

В питоне оператор / предназначен для целочисленного деления.Вы можете рассматривать это как деление на число с плавающей точкой, за которым следует операция floor.

Например,

8/7 == floor (8.0 / 7.0) == 1

8 / -7 == этаж (8,0 / -7,0) == -2

...