Вопрос-Ответ

Why does the division get rounded to an integer? [duplicate]

Почему деление округляется до целого числа?

Я пытался нормализовать набор чисел от -100 до 0 в диапазоне 10-100, и у меня возникли проблемы, только чтобы заметить, что даже при полном отсутствии переменных это не соответствует моим ожиданиям:

>>> (20-10) / (100-10)
0

Деление с плавающей точкой тоже не работает:

>>> float((20-10) / (100-10))
0.0

Если любая сторона деления преобразуется к значению с плавающей точкой, это сработает:

>>> (20-10) / float((100-10))
0.1111111111111111

Каждая сторона в первом примере вычисляется как int, что означает, что окончательный ответ будет преобразован в int . Поскольку 0.111 меньше .5, оно округляется до 0. На мой взгляд, это непрозрачно, но я думаю, что так оно и есть.

Каково объяснение?

Переведено автоматически
Ответ 1

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

>>> 1 / 2
0

Вы должны сделать одно из них float:

>>> float(10 - 20) / (100 - 10)
-0.1111111111111111

или from __future__ import division, который заставляет / принять поведение Python 3.x, которое всегда возвращает значение с плавающей точкой.

>>> from __future__ import division
>>> (10 - 20) / (100 - 10)
-0.1111111111111111
Ответ 2

Вы вводите целые числа, поэтому Python возвращает вам целое число:

>>> 10 / 90
0

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

Если вы используете значения с плавающей запятой по обе стороны от деления, то Python даст вам ожидаемый ответ.

>>> 10 / 90.0
0.1111111111111111

Итак, в вашем случае:

>>> float(20-10) / (100-10)
0.1111111111111111
>>> (20-10) / float(100-10)
0.1111111111111111
Ответ 3

В Python 2.7 оператор / является целочисленным делением, если входные данные являются целыми числами:

>>>20/15
1

>>>20.0/15.0
1.33333333333

>>>20.0/15
1.33333333333

В Python 3.3 оператор / является делением с плавающей точкой, даже если входные данные являются целыми числами.

>>> 20/15
1.33333333333

>>>20.0/15
1.33333333333

Для целочисленного деления в Python 3 мы будем использовать оператор // .

Оператор // является оператором целочисленного деления как в Python 2.7, так и в Python 3.3.

В Python 2.7 и Python 3.3:

>>>20//15
1

Теперь посмотрите сравнение

>>>a = 7.0/4.0
>>>b = 7/4
>>>print a == b

Для вышеупомянутой программы вывод будет False в Python 2.7 и True в Python 3.3.

В Python 2.7 a = 1.75 и b = 1.

В Python 3.3 a = 1.75 и b = 1.75 только потому, что / это деление с плавающей точкой.

Ответ 4

Вам нужно изменить его на значение с плавающей точкой, ПРЕЖДЕ чем выполнять деление. То есть:

float(20 - 10) / (100 - 10)
python