У меня есть два целых значения a
и b
, но мне нужно их соотношение в плавающей запятой. Я знаю это a < b
и хочу вычислить a / b
, поэтому, если я использую целочисленное деление, я всегда получу 0 с остатком от a
.
Как я могу заставить c
быть числом с плавающей точкой в Python в следующем?
c = a / b
python
floating-point
integer
division
python-2.x
Натан Феллман
источник
источник
Ответы:
В Python 2 деление двух целых дает int. В Python 3 он создает плавающее число. Мы можем получить новое поведение, импортируя из
__future__
.источник
from __future__ import division
должно быть в самом начале файла//
когда хотите разделение по полу, и/
когда вы хотитеfloat
разделить «true» ( ).Вы можете бросить, чтобы плавать, делая
c = a / float(b)
. Если числитель или знаменатель - это число с плавающей точкой, то результат также будет.Предостережение: как указали комментаторы, это не сработает, если
b
может быть чем-то иным, чем целое число или число с плавающей точкой (или строка, представляющая единицу). Если вы можете иметь дело с другими типами (такими как комплексные числа), вам нужно либо проверить их, либо использовать другой метод.источник
Что действительно спрашивают здесь:
«Как мне заставить истинное деление таким, что
a / b
вернет дробь?»Обновление до Python 3
В Python 3, чтобы получить истинное деление, вы просто делаете
a / b
.Классическое деление по полу для целых чисел теперь
a // b
:Тем не менее, вы можете застрять с использованием Python 2, или вы можете писать код, который должен работать как в 2 и 3.
Если использовать Python 2
В Python 2 это не так просто. Некоторые способы работы с классическим делением Python 2 лучше и надежнее, чем другие.
Рекомендация для Python 2
Вы можете получить поведение деления Python 3 в любом модуле со следующим импортом вверху:
который затем применяет деление стиля Python 3 на весь модуль. Он также работает в оболочке Python в любой точке. В Python 2:
Это действительно лучшее решение, поскольку оно гарантирует, что код вашего модуля более совместим с Python 3.
Другие опции для Python 2
Если вы не хотите применять это ко всему модулю, вы ограничены несколькими обходными путями. Наиболее популярным является приведение одного из операндов в число с плавающей точкой. Одним из надежных решений является
a / (b * 1.0)
. В новой оболочке Python:Также надежный
truediv
изoperator
модуляoperator.truediv(a, b)
, но это, вероятно, медленнее, потому что это вызов функции:Не рекомендуется для Python 2
Обычно это видно
a / float(b)
. Это вызовет ошибку TypeError, если b - комплексное число. Поскольку деление с комплексными числами определено, для меня имеет смысл не допустить сбоя деления при передаче комплексного числа для делителя.Мне не имеет смысла целенаправленно делать ваш код более хрупким.
Вы также можете запускать Python с
-Qnew
флагом, но у этого есть недостаток - выполнение всех модулей с новым поведением Python 3, и некоторые из ваших модулей могут ожидать классическое разделение, поэтому я не рекомендую этого, кроме как для тестирования. Но для демонстрации:источник
источник
В Python 3.x одиночная косая черта (
/
) всегда означает истинное (не усеченное) деление. (//
Оператор используется для усечения деления.) В Python 2.x (2.2 и выше) вы можете получить то же самое поведение, поставивв верхней части вашего модуля.
источник
Создание любого из параметров для деления в формате с плавающей запятой также приводит к выводу в формате с плавающей запятой.
Пример:
или,
или,
или,
источник
1.0 + 1/3
илиfloat(c) + a/b
илиfloat(a/b)
и вы будете разочарованы ответом. Лучше использовать Python 3+ или импортировать__future__.division
модуль (см. Принятый ответ), чтобы всегда получить ожидаемый ответ. Существующие правила деления создают коварную, трудно прослеживаемую математическую ошибку.python -c 'a=10; b=3.0; print a/b'
?a
и 'b', например, являются выходами функции целочисленного значения? Например,a = len(list1), b = len(list2)
.float(..)
. Я думаю, что умножение на1.0
, как предложил @Pinochle ниже, также может быть полезным.Добавьте точку (
.
) для обозначения чисел с плавающей точкойисточник
float()
одну из переменных.Это тоже будет работать
источник
a
иb
../
что в Python действительный оператор, который позволяет вам выполнять деление с плавающей запятой. Вот почему хорошо использовать пробелы разумно на любом языке программированияЕсли вы хотите использовать «истинное» (с плавающей запятой) деление по умолчанию, есть флаг командной строки:
Есть некоторые недостатки (от PEP):
Вы можете узнать больше о других значениях флагов, которые изменяют / предупреждают о поведении деления, посмотрев справочную страницу Python.
Для получения полной информации об изменениях деления читайте: PEP 238 - Изменение оператора деления
источник
источник
a
int иb
float. Лучшее решение в том же духе - это сделать,from operator import truediv
а затем использоватьtruediv(a, b)
.где а - дивиденд, а б - делитель. Эта функция удобна, когда частным после деления двух целых чисел является число с плавающей точкой.
источник