Як я можу змусити поділ бути плаваючою точкою в 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 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