it-swarm.com.ru

Как я могу заставить деление быть плавающей точкой? Деление продолжает округляться до 0?

У меня есть два целочисленных значения a и b, но мне нужно их соотношение в плавающей запятой. Я знаю, что a < b, и я хочу вычислить a / b, поэтому, если я использую целочисленное деление, я всегда получу 0 с остатком a.

Как заставить c быть числом с плавающей запятой в Python в следующем?

c = a / b
679
Nathan Fellman

В Python 2 деление двух целых дает int. В Python 3 он создает плавающее число. Мы можем получить новое поведение, импортировав из __future__.

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
768
Michael Fairley

Вы можете разыграть на плаву, выполнив c = a / float(b). Если числитель или знаменатель - это число с плавающей точкой, то результат также будет.


Предостережение: как указали комментаторы, это не будет работать, если b может быть чем-то отличным от целого числа или числа с плавающей точкой (или строки, представляющей единицу). Если вы можете иметь дело с другими типами (такими как комплексные числа), вам нужно либо проверить их, либо использовать другой метод.

697
Steve Trout

Как заставить деление быть плавающей точкой в ​​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 из модуля operatoroperator.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
182
Aaron Hall
c = a / (b * 1.0)
132
Pinochle

В Python 3.x одиночная косая черта (/) всегда означает истинное (не усеченное) деление. (Оператор // используется для усечения деления.) В Python 2.x (2.2 и выше) вы можете получить то же поведение, поставив

from __future__ import division

в верхней части вашего модуля.

65
newacct

Создание любого из параметров для деления в формате с плавающей запятой также приводит к выводу в формате с плавающей запятой.

Пример:

>>> 4.0/3
1.3333333333333333

или же,

>>> 4 / 3.0
1.3333333333333333

или же,

>>> 4 / float(3)
1.3333333333333333

или же,

>>> float(4) / 3
1.3333333333333333
29
gsbabil

Добавьте точку (.), чтобы указать числа с плавающей точкой

>>> 4/3.
1.3333333333333333
20
Alexander

Это тоже будет работать

>>> u=1./5
>>> print u
0.2
12
Gaurav Agarwal

Если вы хотите использовать "истинное" (с плавающей запятой) деление по умолчанию, есть флаг командной строки:

python -Q new foo.py

Есть некоторые недостатки (от PEP):

Утверждалось, что параметр командной строки для изменения значения по умолчанию является злом. Конечно, это может быть опасно в чужих руках: например, было бы невозможно объединить сторонний библиотечный пакет, который требует -Qnew, с другим, который требует -Qold.

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

Для получения полной информации об изменениях деления читайте: PEP 238 - Смена оператора деления

6
stephenbez

если вы сделаете деление на два целых числа python вернет вам целое число, то вам нужно сделать:

c = float(a)/b

или же

c = a/float(b)

и затем получите c как тип float

6
Juan Camilo Torres Sánchez
from operator import truediv

c = truediv(a, b)
3
JoeCondron

Это тоже будет работать

u = 1./5 напиши u

0.2

ответил 24 дек. 13 в 19:58 Гаурав Агарвал 6,7172279140

Спасибо Gauraw, это делает трюк и является довольно аккуратным решением. Если и числитель, и знаменатель являются переменными, "решением" может быть умножение 1. на частное.

Пример:

aa = 2
bb = 3

aa / bb = 0

1. * aa / bb = 0.6666666666666666

;-)

Макс - Италия

1
Max1234-ITA
from operator import truediv

c = truediv(a, b)

где а - дивиденд, а б - делитель. Эта функция удобна, когда частным после деления двух целых чисел является число с плавающей точкой.

1
Chetan Yeshi