Целочисленное деление Python дает float

Python 3.1 (r31:73574, Jun 26 2009, 20:21:35) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2/2
1.0

Это предназначено? Я сильно помню предыдущие версии, возвращающие int/int=int? Что мне делать, есть ли новый оператор деления или должен ли я всегда использовать?

Ответ 1

Взгляните на PEP-238: изменение оператора отдела

Оператор//будет иметь возможность запросить разделение по полу однозначно.

Ответ 2

Не удалось сразу найти 2//2.

Ответ 3

Надеюсь, что это может помочь кому-то мгновенно.

Поведение оператора разделения в Python 2.7 и Python 3

В Python 2.7: по умолчанию оператор деления возвращает целочисленный вывод.

чтобы получить результат в double multiple 1.0 в "дивиденд или делитель"

100/35 => 2 #(Expected is 2.857142857142857)
(100*1.0)/35 => 2.857142857142857
100/(35*1.0) => 2.857142857142857

В Python 3

// => used for integer output
/ => used for double output

100/35 => 2.857142857142857
100//35 => 2
100.//35 => 2.0    # floating-point result if divsor or dividend real

Ответ 4

В принятом ответе уже упоминается PEP 238. Я просто хочу добавить быстрый взгляд за кулисы для тех, кто интересуется тем, что происходит, не читая весь PEP.

Python отображает операторы типа +, -, * и / на специальные функции, такие, например, a + b эквивалентно

a.__add__(b)

Что касается деления на Python 2, по умолчанию используется только /, который сопоставляется с __div__, и результат зависит от типов ввода (например, int, float).

Python 2.2 представил функцию __future__ division, которая изменила семантику деления следующим образом (TL; DR из PEP 238):

  • / отображается на __truediv__, который должен "вернуть разумную аппроксимацию математический результат деления "(цитата из PEP 238)
  • // отобразится в __floordiv__, который должен вернуть результат на основе /

С Python 3.0 изменения PEP 238 стали по умолчанию, и в объектной модели Python не существует особого метода __div__.

Если вы хотите использовать тот же код в Python 2 и Python 3, используйте

from __future__ import division

и придерживаться семантики PEP 238 / и //.