Why does integer division yield a float instead of another integer?
Почему целочисленное деление дает значение с плавающей точкой вместо другого целого числа?
Рассмотрим это деление в Python 3:
>>> 2/2 1.0
Это задумано? Я хорошо помню, как возвращались более ранние версии int/int = int. Что мне делать? Есть ли новый оператор деления или я всегда должен выполнять приведение?
// => used for integer output / => used for double output
100/35 => 2.857142857142857 100//35 => 2 100.//35 => 2.0 # Floating-point result if the divisor or dividend is 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, используйте