Я недавно заметил, что int()
округляет число с плавающей точкой до 0, а целочисленное деление округляет число с плавающей точкой до его пола.
например:
-7 // 2 = -4
int(-7/2) = -3
Я прочитал документацию, в которой указано:
класс int (x, base = 10)
Вернуть целочисленный объект, построенный из числа или строки x, или вернуть 0, если аргументы> не заданы. Если x - это число, верните x. int (). Для чисел с плавающей запятой это усекается до нуля.
а также:
этажное подразделение
Математическое деление, которое округляется до ближайшего целого числа. Оператор подразделения этажа //. Например, выражение 11 // 4 оценивается как 2 в отличие от 2.75, возвращаемого делением с плавающей запятой. Обратите внимание, что (-11) // 4 равно -3, потому что это -2,75 с округлением вниз. Смотри PEP 238.
Но мне кажется нелогичным, что 2 аналогичные операции (деление с плавающей точкой на целое) должны возвращать разные результаты.
Есть ли мотивация для различий между функциями?
Спасибо.
источник
Ответы:
Согласованность.
Вам нужно будет следовать некоторым очень простым и, казалось бы, нерелевантным объяснениям, чтобы понять это.
В школе вы выучили деление с остатком. И вы сделали расчеты следующим образом:
Позже вы выучили деления на действительные числа:
До этого момента вы можете в это поверить
x // 4
иint(x/4)
всегда давать один и тот же результат. Это ваше текущее понимание ситуации.Однако посмотрите, что происходит при целочисленном делении: число за R циклически изменяется от 3, 2, 1 до 0, а затем перезапускается: 3, 2, 1, 0. Число перед R уменьшается с каждым 4-м шагом.
Итак, как это будет продолжаться?
В то же время деление действительных чисел дает нам:
Вот почему
-1 // 4
дает -1, ноint(-1/4)
дает 0.Ну, они служат различным целям:
//
это часть вычисления целых чисел с остатками иint()
дает вам часть перед.
операцией с действительным числом.Вы решаете, что вы хотите вычислить, затем вы решаете, какой оператор использовать в Python, чтобы получить правильный результат.
Хороший вопрос. Продолжайте учиться.
источник
//
оператора в Python 3 заключается в том, чтобы избежать принудительного использования int (float). Если это не так, когда я должен реализовать использованиеint()
и когда я должен реализовать использование//
Math.Floor(3.23) != -Math.Floor(-3.23)
той же причине-((-x)//y)
не обязательно равныx//y
.Я бы сказал, что ваше наблюдение о том, что эти 2 операции должны быть интуитивно схожими, ожидается, поскольку при положительных числах они ведут себя одинаково. Но если вы посмотрите на их происхождение (одно исходит из математики, а другое из информатики), тогда становится более понятным их различное поведение.
Вы можете посмотреть там концепции:
================================================== ================
I) Этажное деление или функция пола, применяемое к математическому разделению
Функция пола является очень хорошо зарекомендовавшим себя понятием в математике.
От mathworld.wolfram :
Таким образом, разделение по этажам - это не более, чем функция по этажам, применяемая к математическому разделению. Поведение очень ясное, «математически точное».
II) Тип преобразования / Тип литья
Из википедии :
В большинстве языков программирования приведение формы с плавающей точкой к целому применяется правилом округления (так что существует соглашение):
Правило округления согласно IEEE 754 .
Итак, другими словами, причина различия между целочисленным делением и преобразованием с плавающей точкой в int в python является математической, вот некоторые соображения от Гвидо ван Россума (думаю, мне не нужно его представлять: D) (из блог История Python, статья «Почему полы целочисленного деления Python» )
источник