Арифметика по модулю с отрицательными операндами различается в разных языках и зависит от определения языка для вождения. В Java Модуль больше похож на Остаток .
Обычно, если вы хотите получить отрицательное число для отрицательных входов, вы можете использовать это:
int r = x % n;
if (r > 0 && x < 0)
{
r -= n;
}
Или, если вы использовали язык, который возвращает отрицательное число на отрицательном входе, и вы бы предпочли положительное:
int r = x % n;
if (r < 0)
{
r += n;
}
Итак, исходя из того, что вам нужно в качестве желаемого результата, я рекомендую вам использовать соответствующую реализацию, а не полагаться на язык для вычислений для вас.
Кроме того, обратите внимание, что то, что должно быть в случае с Java, описано в JLS: в разделе 15.17.3 - Оператор остатка%. Они дают мотивацию (что a% b должно быть таким, что (a / b) * b + (a% b) равно a), но именно включение этого раздела в JLS делает результат таким.