Разница между реализацией модуля в Python Vs Java
Я заметил различные реализации модуля модуля в Python и Java.
Например, в Python:
>>> print -300 % 800
>>> 500
В то время как в Java:
System.out.println(-300 % 800);
-300
Это застало меня врасплох, так как я думал, что что-то такое же основное, как и модуль, универсально интерпретируется одинаково. Я поклонник интерпретации Python (который, как я полагаю, заимствован из C), хотя я вижу логику реализации Java.
Что вы обычно предпочитаете? Есть ли какая-то конкретная причина для разных интерпретаций? Я не собираюсь начинать языческую войну, просто любопытно.
Ответы
Ответ 1
Я предпочитаю интерпретацию С (также используемую в Python), где %
действительно является оператором модуля. Хорошая дискуссия на странице wikipedia и ссылки из нее (в том числе один бит о том, почему принятие вместо этого признака дивиденда может привести к одной глупой ошибке, если только один осторожный; -).
Ответ 2
Теперь попробуйте следующее:
>>> print 300 % -800
-500
Причина разницы в том, что разработчики языка не могут решить, должен ли остаток после деления иметь знак дивиденда или делителя. Некоторые языки даже не задают один или другой, поэтому до исполнителя.
Там есть список языков, оператор и какой знак ожидать на Modulo operation на странице Википедии. Это хорошее место для начала, но я обычно просто запускаю несколько простых тестов, чтобы убедиться, что я точно знаю, как будет вести себя %
, прежде чем использовать его на любом языке, который я раньше не тестировал.
Ответ 3
В стандарте C отрицательный modulo равен undefined, и многие компиляторы C предоставят вам то, что Java дает вам. В python, однако, вы всегда получите положительное число, которое часто более полезно, потому что это означает, что вы можете выполнять добавление и вычитание по модулю. Если отрицательный modulo должен был дать вам отрицательный результат, это не сработало бы должным образом.
Я не знаю, какие преимущества получают отрицательное число от модуля.
Ответ 4
Я предпочитаю x mod n
давать числа между 0 и n-1 или между полом (n/2) -n и этажом (n/2); это облегчает выполнение математики в одной голове.
Пока все равно, мне все равно, когда дело доходит до языков, хотя нужно знать об этом.
Кстати, Java не может полностью решить -% от отрицательных целых чисел возвращает отрицательное значение, метод mod
java.math.BigInteger
возвращает значения между 0 и n-1 (включительно), а divideAndRemainder
снова возвращает отрицательные значения для отрицательных целых чисел.