Почему деление Python floor возвращает число с плавающей запятой, если делитель и / или дивиденд - это число с плавающей запятой? - PullRequest
0 голосов
/ 02 августа 2020

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

Это пагубно в моем случае, потому что преобразование из большого числа с плавающей запятой в int вместо того, чтобы возвращаемое значение было целым числом произвольной точности, очевидно, теряет точность.

* 1004 целое число. Очевидно, я мог бы создать для этого функцию, например, умножив оба значения на одинаковую величину, чтобы они оба были целыми числами, но это было бы намного медленнее, чем реализация C.

Вот пример : 5.2 // 2 равно 2.0 не 2.

1 Ответ

2 голосов
/ 02 августа 2020

В ответ на ваш вопрос почему? , это сделано намеренно, и обоснование этого содержится в PEP 238:

Разделение этажей будет реализовано во всех Python numeri c типов и будет иметь семантику:

a // b == floor(a/b)

, за исключением того, что тип результата будет общим типом, в который a и b приводятся перед операцией.

В частности, если a и b относятся к одному типу, a//b будет иметь типа тоже. Если входные данные имеют разные типы, они сначала приводятся к общему типу с использованием тех же правил, которые используются для всех других арифметических операторов.

...

Для входов с плавающей запятой результат поплавок. Например:

3.5//2.0 == 1.0

Для комплексных чисел // вызывает исключение, поскольку floor() комплексного числа не допускается.

Этот PEP восходит к Python 2.2. Я исключил абзац, в котором обсуждается устаревшее различие между int и long.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...