Как заставить деление быть плавающей точкой в Python?
У меня есть два целочисленных значения a и b, но мне нужно их соотношение в плавающей запятой. Я знаю, что a <b, и я хочу вычислить a / b, поэтому, если я использую целочисленное деление, я всегда получу 0 с остатком от a.
Как я могу заставить c быть числом с плавающей точкой в Python в следующем?
c = a / b
Что действительно спрашивают здесь:
«Как мне заставить истинное деление таким, что a / b
вернет дробь?»
Обновление до Python 3
В Python 3, чтобы получить истинное деление, вы просто делаете a / b
.
>>> 1/2
0.5
Классическое деление по полу для целых чисел теперь a // b
:
>>> 1//2
0
>>> 1//2.0
0.0
Тем не менее, вы можете застрять с использованием Python 2, или вы можете писать код, который должен работать как в 2 и 3.
Если использовать Python 2
В Python 2 это не так просто. Некоторые способы работы с классическим делением Python 2 лучше и надежнее, чем другие.
Рекомендация для Python 2
Вы можете получить поведение деления Python 3 в любом модуле со следующим импортом вверху:
from __future__ import division
который затем применяет деление стиля Python 3 на весь модуль. Он также работает в оболочке Python в любой точке. В Python 2:
>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0
Это действительно лучшее решение, поскольку оно гарантирует, что код вашего модуля более совместим с Python 3.
Другие опции для Python 2
Если вы не хотите применять это ко всему модулю, вы ограничены несколькими обходными путями. Наиболее популярным является приведение одного из операндов в число с плавающей точкой. Одним из надежных решений является a / (b * 1.0)
. В новой оболочке Python:
>>> 1/(2 * 1.0)
0.5
Также надежный truediv
из operator
модуля operator.truediv(a, b)
, но это, вероятно, медленнее, потому что это вызов функции:
>>> from operator import truediv
>>> truediv(1, 2)
0.5
Не рекомендуется для Python 2
Обычно это видно a / float(b)
. Это вызовет ошибку TypeError, если b - комплексное число. Поскольку деление с комплексными числами определено, для меня имеет смысл не допустить сбоя деления при передаче комплексного числа для делителя.
>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float
Мне не имеет смысла целенаправленно делать ваш код более хрупким.
Вы также можете запускать Python с -Qnew
флагом, но у этого есть недостаток - выполнение всех модулей с новым поведением Python 3, и некоторые из ваших модулей могут ожидать классическое разделение, поэтому я не рекомендую этого, кроме как для тестирования. Но для демонстрации:
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j