x mod -3 возвращает положительные числа

я хочу получить отрицательное число из x mod -3 в Java. например: 1 по модулю -3 = -2 или 2 по модулю -3 = -1

Есть ли метод для этой проблемы?


person Tim Daubenschütz    schedule 04.11.2012    source источник


Ответы (3)


Оператор % в Java — это не оператор модуля, а остаток. (это не одно и то же). Это объясняет разные признаки, которые вы получаете. Из текущей Спецификации языка Java, раздел §15.17.3 :

Говорят, что бинарный оператор % дает остаток своих операндов от подразумеваемого деления; левый операнд — делимое, а правый операнд — делитель.

В C и C++ оператор остатка принимает только целые операнды, но в языке программирования Java он также принимает операнды с плавающей запятой.

Остаточная операция для операндов, которые являются целыми числами после двоичного числового расширения (§5.6.2), производит такое значение результата, что (a/b)*b+(a%b) равно a.

Это тождество сохраняется даже в том особом случае, когда делимое является отрицательным целым числом наибольшей возможной величины для своего типа, а делитель равен -1 (остаток равен 0).

Из этого правила следует, что результат операции остатка может быть отрицательным, только если делимое отрицательно, и может быть положительным, только если делимое положительно. При этом величина результата всегда меньше величины делителя.

person Óscar López    schedule 04.11.2012

X mod -Y, как вы определили, можно вычислить, решив -X mod Y, а затем отрицая ответ.

Пример: 1 mod -3 -> -1 mod 3 = 2 -> -2

В частности, в Java выполните -X % Y, затем добавьте Y, если он не равен нулю, затем отмените ответ.

public static int negativeMod(int x, int y) {
   if (y > 0) return x % y;

   int newAnswer = (-1 * x) % (-1 * y);
   if (newAnswer != 0) newAnswer -= y;

   return -1 * newAnswer;
}
person durron597    schedule 04.11.2012
comment
проблема с этим подходом заключается в том, что согласно Java, negative % positive = negative - person John Dvorak; 04.11.2012
comment
вы не должны добавлять y, если результат по модулю равен нулю. - person John Dvorak; 04.11.2012
comment
Я хочу отрицательное число... --OP => тогда да, y нужно добавить даже для нуля. Проголосовал. - person John Dvorak; 04.11.2012
comment
@JanDvorak Я действительно думаю, что вы были правы в первый раз, и отредактировал мой пост, чтобы отразить это. - person durron597; 04.11.2012
comment
Скажем так, если ОП хочет получить отрицательный ответ, он должен удалить условие ;-) - person John Dvorak; 04.11.2012
comment
Есть ли какая-то причина, по которой вы используете -1 * n для отрицания вместо -n, как обычные люди? :) - person Wug; 04.11.2012
comment
Я хотел сделать это более очевидным для ОП. - person durron597; 04.11.2012

Это просто. Если остаток не равен 0, вычтите модуль. Например, 1 mod -3, 1 - 3 равно -2, ответ, который вы хотите. Это простое следствие математического тождества a == a - n (mod n).

person eh9    schedule 05.11.2012