Мод в Java производит отрицательные числа

Когда я вычисляю int i = -1 % 2, я получаю -1 в Java. В Python я получаю 1 в результате -1 % 2. Что мне нужно сделать, чтобы получить одно и то же поведение в Java с помощью функции modulo?

Ответ 1

Проблема в том, что в Python оператор% возвращает модуль, а в Java он возвращает остаток. Эти функции дают одинаковые значения для положительных аргументов, но модуль всегда возвращает положительные результаты для отрицательного ввода, тогда как остальные могут давать отрицательные результаты. Там есть еще информация об этом в этом вопросе.

Вы можете найти положительное значение, выполнив следующее:

int i = (((-1 % 2) + 2) % 2)

или это:

int i = -1 % 2;
if (i<0) i += 2;

(очевидно, -1 или 2 может быть любым, что вы хотите, чтобы числитель или знаменатель был)

Ответ 2

Начиная с Java 8 вы можете использовать метод Math.floorMod():

Math.floorMod(-1, 2); //== 1

Примечание. Если значение по модулю (здесь 2) отрицательное, все выходные значения также будут отрицательными.:)

Источник: fooobar.com/questions/37418/...

Ответ 3

Если вам нужно n % m, то:

int i = (n < 0) ? (m - (abs(n) % m) ) %m : (n % m);

математическое объяснение:

n = -1 * abs(n)
-> n % m = (-1 * abs(n) ) % m
-> (-1 * (abs(n) % m) ) % m
-> m - (abs(n) % m))

Ответ 4

if b > 0:
    int mod = (mod = a % b) < 0 ? a + b : a;

Не использует оператор % дважды.

Ответ 5

Если модуль равен 2, вы можете использовать битмаску:

int i = -1 & ~-2; // -1 MOD 2 is 1

Для сравнения, язык Pascal предоставляет два оператора; REM принимает знак числителя (x REM y - x - (x DIV y) * y, где x DIV y - TRUNC(x / y)), а MOD требует положительного знаменателя и возвращает положительный результат.