Отдел Python
Я пытался нормализовать набор чисел от -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 меньше, чем 0,5, он округляется до 0. Это не прозрачно, на мой взгляд, но я думаю, что так оно и есть.
Какое объяснение?
Ответы
Ответ 1
Вы используете Python 2.x, где целые деления усекаются вместо того, чтобы стать числом с плавающей запятой.
>>> 1 / 2
0
Вы должны сделать один из них float
:
>>> float(10 - 20) / (100 - 10)
-0.1111111111111111
или from __future__ import division
, которые силы /
принимают поведение Python 3.x, которое всегда возвращает float.
>>> from __future__ import division
>>> (10 - 20) / (100 - 10)
-0.1111111111111111
Ответ 2
Вы помещаете целые числа, поэтому Python дает вам целое число назад:
>>> 10 / 90
0
Если после того, как вы поместите это в поплавок, округление будет уже выполнено, другими словами, целое число 0 всегда будет 0 float.
Если вы используете поплавки по обе стороны от деления, то Python даст вам ответ, который вы ожидаете.
>>> 10 / 90.0
0.1111111111111111
Итак, в вашем случае:
>>> float(20-10) / (100-10)
0.1111111111111111
>>> (20-10) / float(100-10)
0.1111111111111111
Ответ 3
Вам нужно изменить его на поплавок, прежде чем вы делите. То есть:
float(20 - 10) / (100 - 10)
Ответ 4
Это связано с используемой версией python. В основном он принимает поведение C: если вы разделите два целых числа, результаты будут округлены до целого числа. Также имейте в виду, что Python выполняет операции слева направо, что играет роль при выводе типов.
Пример:
Поскольку это вопрос, который всегда появляется у меня в голове, когда я делаю арифметические операции (должен ли я преобразовать в float и какой номер), представлен пример из этого аспекта:
>>> a = 1/2/3/4/5/4/3
>>> a
0
Когда мы делим целые числа, неудивительно, что он округляется ниже.
>>> a = 1/2/3/4/5/4/float(3)
>>> a
0.0
Если мы будем выводить последнее целое число для float, мы все равно получим нуль, так как к тому времени, когда наш номер делится на float, он уже стал 0 из-за целочисленного деления.
>>> a = 1/2/3/float(4)/5/4/3
>>> a
0.0
Тот же сценарий, что и выше, но слегка приближающий метод float немного ближе к левой стороне.
>>> a = float(1)/2/3/4/5/4/3
>>> a
0.0006944444444444445
Наконец, когда мы выберем первое целое число для float, результат будет желательным, так как начиная с первого деления, то есть самого левого, мы используем float.
Дополнительно 1: Если вы пытаетесь ответить на это, чтобы улучшить арифметическую оценку, вы должны проверить this
Дополнительно 2: Пожалуйста, будьте осторожны со следующим сценарием:
>>> a = float(1/2/3/4/5/4/3)
>>> a
0.0
Ответ 5
В 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, просто потому, что /
является поплавковым делением.
Ответ 6
Сделайте хотя бы один из них float, тогда это будет float-деление, а не целое число:
>>> (20.0-10) / (100-10)
0.1111111111111111
Приведение результата в float слишком поздно.
Ответ 7
Указание поплавка путем размещения символа '.' после того, как число также приведет к поплавке по умолчанию.
>>> 1 / 2
0
>>> 1. / 2.
0.5
Ответ 8
В любом случае это целочисленное деление. 10/90 = 0. Во втором случае вы просто бросаете 0 в поплавок.
Попробуйте использовать один из операндов "/" как float:
float(20-10) / (100-10)
Ответ 9
Вы бросаете плавать после того, как деление уже произошло во втором примере. Попробуйте следующее:
float(20-10) / float(100-10)
Ответ 10
Я несколько удивлен, что никто не упомянул, что исходный плакат мог бы принести рациональные числа. Если вы заинтересованы в этом, программа на основе Python У Sage есть ваша спина. (В настоящее время все еще основан на Python 2.x, хотя 3.x уже идет.)
sage: (20-10) / (100-10)
1/9
Это не решение для всех, потому что оно делает некоторые приготовления, поэтому эти числа не являются int
s, а Sage Integer
элементами класса. Тем не менее, стоит упомянуть как часть экосистемы Python.
Ответ 11
Лично я предпочел вставить 1. *
в самом начале. Итак, выражение выглядит примерно так:
1. * (20-10) / (100-10)
Как я всегда делаю деление для некоторой формулы вроде:
accuracy = 1. * (len(y_val) - sum(y_val)) / len(y_val)
поэтому невозможно просто добавить .0
как 20.0
. И в моем случае обертка с float()
может потерять немного читаемость.