В Python операция % осуществляет взятие по модулю или modulo operation, что сильно отличает её от аналогичной операции в Java. Если использовать её для положительных чисел, то результат одинаковый с Java, но для отрицательных чисел операции взятия остатка в Java и операция взятия по модулю в Python отличаются.
Давайте убедимся, что для отрицательных чисел результаты операции % в Java и в Python будут разными.
Python:
1 2 3 4 5 6 |
$ python3 Python 3.5.3 (default, Sep 27 2018, 17:25:39) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information. >>> 13 % -9 -5 |
Java (используем JShell):
1 2 3 4 5 6 |
$ ./jshell | Welcome to JShell -- Version 10.0.1 | For an introduction type: /help intro jshell> 13 % -9 $1 ==> 4 |
Итак, мы имеем результат 13 % -9 == -5 для Python и 13 % -9 == 4 для Java.
Отчего же получается такая разница в результатах? Всё дело в том, что в Java операция % возвращает остаток, а в Python операция % является реализацией modulo operation, которая имеет немного другой смысл.
Чтобы объяснить, что такое modulo operation, давайте представим часы.
Для целых чисел при вычислении результата modulo operation мы рисуем циферблат с числами до 9 и по часовой стрелке отсчитаем до 13, а там будет число 4, что и будет результатом операции 13 % 9 для Python:
Как же быть, если мы вычисляем 13 % -9? Тогда часы становятся совсем другими:
Как видим, результатом станет число -5, что совпадает с ответом, который даёт Python для 13 % -9.
Зачем это нужно? Я пока с этим не особо разобрался, но Modulo operation должно использоваться в криптографии, вроде как.
Рекомендую также изучить мой учебник Python 3 (пока в процессе написания)., а также мой учебник Java.