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

223
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? Что мне делать, есть ли новый оператор деления или я должен всегда разыгрывать?

Йонас Быстрём
источник
31
Да, так работает деление в 3.x.
hughdbrown
2
Вот сообщение создателя Python о том, как работает округление, оно ортогонально вашему вопросу, но я нашел его интересным: python-history.blogspot.com/2010/08/…
Aaron D
@hughdbrown, так что значит для всех версий Python 3 по существу?
Чарли Паркер
@hughdbrown: да, PEP является окончательным , то есть принятым и реализованным.
Йонас Быстрем

Ответы:

285

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

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

Брэндон Э Тейлор
источник
10
@JonathanSternberg за исключением всего кода, который был написан для Python 2.0. Я чувствую, что роль / и // должна быть обращена вспять, чтобы сохранить обратную совместимость. Кроме того, почти во всех других языках / типах сохранения. Я бы имел больше смысла, чем // автоматически конвертировать в float, а не /.
Тханг
1
Вторая часть (после «Также») имеет смысл (сходство с другими языками), но в отношении первой части весь смысл Python 3 заключался в том, чтобы НЕ быть обратно совместимым с Python 2, а скорее исправлять кучу проблем с Python 2. достаточно люди нашли двусмысленность /быть достаточно языком дизайна «ошибка» , которая должна были быть установлена в Python 3. это может быть спорным решение, но достаточное количество людей чувствовали , что это было правильной. Посчитай меня в группе, которая любит перемены. Хорошо, что мы все можем согласиться не согласиться. Приветствия. :)
Рэй
59

Ой, сразу нашел 2//2.

Йонас Быстрём
источник
5
Не могли бы вы уточнить?
BlueFast
4
Используя это, вы получите int, а не float @dangonfast.
Ашиш Ахаджа
Кажется, это не работает для отрицательных чисел. -1 // 5 возвращает -1 и -5 // 5 возвращает -1.
mschuett
@mschuett: этого и следовало ожидать, и это тот же результат, что и с Python 2.
Йонас Быстрем
1
Да, я еще покопался и выяснил это. Однако я думаю, что приличное количество людей не осознают этого в зависимости от языка, с которого они пришли.
mschuett
45

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

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

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

чтобы получить результат в двойном кратном 1,0, чтобы «дивиденд или делитель»

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

В питоне 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
VijayNaidu
источник
1
Кстати, не нужно умножать на 1,0. Достаточно того, что одно из чисел является поплавком. Например, 100/35,0 = 100,0 / 35 = 2,857142857142857
Тэл Дж. Леви,
21

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

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 стали поведением по умолчанию, и __div__в объектной модели Python больше нет специального метода .

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

from __future__ import division

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

code_onkel
источник
0

Согласно документации Python3, Python при делении на целое число будет генерировать число с плавающей точкой, несмотря на то, что ожидается, что оно будет целым

Для исключительно целочисленной печати используйте floor division method. Разделение по полу округляет ноль и удаляет десятичную точку.Represented by //

Следовательно, вместо 2/2 используйте 2//2

Вы также можете импортировать деление __future__независимо от использования python2 или python3.

Надеюсь, поможет!

Адити
источник