Результат -1% 7 отличается в javascript (-1) и python (6)

Выражение -1 % 7 в JavaScript дает мне -1 в качестве результата. В то время как в Python и Haskell, я нашел результат равным 6 .

Может ли кто-нибудь объяснить, почему у обоих разные виды поведения? Какой из них правильный?

5 Solutions collect form web for “Результат -1% 7 отличается в javascript (-1) и python (6)”

Я дам немного другой ответ. Как говорили другие, функции могут выполнять все, что вы их определяете, и m - x = -x mod m . В качестве прелюдии я отмечу, что у Haskell есть две «mod» -функции, mod и rem которые отличаются только этим аспектом. Вы можете сделать случай, когда mod является предпочтительным математически. rem соответствует тому, что вы получите на процессоре x86. Существует, по сути, третья, евклидова, которая может быть даже лучше, а также описана Раймондом Бутом в евклидовых определениях функций Div и Mod . Третья форма всегда возвращает положительный модуль. (Есть, по сути, как минимум два других варианта, которые можно сделать.)

Таким образом, определение Javascript – это то, что вы получаете от большинства mod операций модема. В этом смысле это может быть предпочтительнее, поскольку это сделает его более эффективным для реализации. Математически определение Haskell's и Python лучше, чем Javascript. Существует также третье определение, которое может быть немного лучше.

Одним из ключевых свойств, которые обладают обеими евклидовыми и Haskell / Python-определениями, является x mod m = y mod m , эквивалентно x = y mod m которое отсутствует в определении Javascript. Вы можете проверить, вычислив 6 % 7 в Javascript.

Оба правильные, они просто используют разные соглашения относительно обработки отрицательных операндов. Для положительных чисел соглашения совпадают, а для отрицательных чисел – нет. В Python a % b всегда имеет тот же знак, что и b .

В дальнейшем я буду использовать нотацию Python, где // используется для целочисленного деления.

Позволять

 q, r = a // b, a % b 

затем

 a == q * b + r 

должно быть истинным на любом языке (предполагая, что a и b являются целыми числами, причем b не равно нулю). Таким образом, способ обработки остатка должен соответствовать соглашению, используемому для целочисленного деления. В Python целочисленное деление является делением по полу, т. Е. Результат округляется до отрицательной бесконечности. В некоторых других языках используется округление к нулю. И на некоторых языках вы получаете любое соглашение, которое разработчик ЦП решил реализовать, поэтому один и тот же код, выполняемый на другом оборудовании, может дать разные результаты. Как вы можете себе представить, это может быть несколько раздражающим. 🙂

Оба правильные. Некоторые языки возвращают положительные по модулю числа, а другие сохраняют свой знак.

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


Псевдокод для преобразования a%b между двумя:

На языке, где -1%7 == -1 , вы делаете это, чтобы получить положительное число:

 ((a%b)+b) % b 

И на языке, где -1%7 == 6 вы можете сделать это, чтобы получить подписанную версию:

 if a < 0: return (a%b)-b else: return a%b 

Оба правильные.

Чтобы выполнить другие ответы, вы также можете рассмотреть функцию divmod в Python:

Возьмите два (не сложных) числа в качестве аргументов и верните пару чисел, состоящих из их частного и остального при использовании целочисленного деления. Со смешанными типами операндов применяются правила для двоичных арифметических операторов. Для целых чисел результат будет таким же, как (a // b, a % b) . Для чисел с плавающей запятой результат (q, a % b) , где q обычно math.floor(a / b) но может быть на 1 меньше. В любом случае q * b + a % b очень близко к a , если a % b отличен от нуля, он имеет тот же знак, что и b , и 0 <= abs(a % b) < abs(b) .

 >>> divmod(-1, 7) (-1, 6) 

% Обозначает разные операторы в JavaScript и Python.

В JavaScript % обозначает оператор Remainder . В документации уже указывается разница между оставшейся частью и модульной операцией:

Оператор остатка возвращает оставшийся остаток, когда один операнд делится на второй операнд. Он всегда принимает знак дивиденда, а не делитель. Он использует встроенную функцию modulo для получения результата, который является целым остатком деления var1 на var2 – например, – var1 modulo var2. Существует предложение получить фактический модуль-оператор в будущей версии ECMAScript, причем разница заключается в том, что результат оператора modulo будет принимать знак делителя, а не дивиденд.

(Подчеркнуто мной)

В отличие от этого: в Python % обозначает оператор modulo . В документации также делается заявление о знаке:

Оператор % (modulo) дает остаток от деления первого аргумента на второй. Числовые аргументы сначала преобразуются в общий тип. Аргумент zero right вызывает исключение ZeroDivisionError. […] Оператор modulo всегда дает результат с тем же знаком, что и его второй операнд (или ноль) ; абсолютное значение результата строго меньше абсолютного значения второго операнда [2].

(Подчеркнуто мной)

  • Могу ли я найти элемент с использованием регулярного выражения с Python и Selenium?
  • Отображение документов MongoDB с помощью HTML
  • int ((0.1 + 0.7) * 10) = 7 на нескольких языках. Как предотвратить это?
  • Как применить ajax для получения данных в выпадающем меню?
  • Как включить / отключить несколько кнопок отправки в форме в зависимости от выбора переключателя
  • Как подключаемый модуль может улучшить JavaScript?
  • Имитация терминала linux в браузере
  • Модель не имеет атрибута _committed
  • Python - лучший язык программирования в мире.