Вопрос-Ответ

Why does integer division yield a float instead of another integer?

Почему целочисленное деление дает значение с плавающей точкой вместо другого целого числа?

Рассмотрим это деление в Python 3:

>>> 2/2
1.0

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


В 2.x поведение действительно было обратным; см. Как я могу принудительно использовать деление с плавающей запятой? Деление продолжает округляться до 0? для противоположного, специфичной для 2.x проблемы.

Переведено автоматически
Ответ 1

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


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


Ответ 2

Упс, сразу найдено 2//2. Это выведет значение int, а не float.

Ответ 3

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

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

Чтобы получить результат в double, умножьте делимое или делитель на 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 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, используйте

from __future__ import division

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

2023-09-09 00:30 python python-3.x