Java modulo operator %
основан на усеченном делении (см. Википедия: операция Modulo).
-
5%3
создает2
(обратите внимание, что5/3
создает1
) -
5%(-3)
создает2
(обратите внимание, что5/(-3)
создает-1
) -
(-5)%3
создает-2
(обратите внимание, что(-5)/3
создает-1
) -
(-5)%(-3)
создает-2
(обратите внимание, что(-5)/(-3)
производит1
)
В вычислительной науке, учитывая два целых числа a
и n
, n
> 0, иногда полезно получить единственное целое число r
внутри [a,n[
, которое соответствует a
по модулю n
.
Вопрос
Существует ли в Java эффективный общий оператор/метод, который соблюдает эту спецификацию по модулю?
Это нужно, чтобы не переписывать его в каждом проекте, где это необходимо...
Разное
Я нашел много вопросов о stackoverflow об этой проблеме, большинство из которых путают различные реализации по модулю. Если вы просто обеспокоены результатами работы модуля по отрицательным числам, ниже приведены некоторые реализации на основе Java %
operator, которые могут быть полезны.
Общий хак
Поскольку мы вряд ли используем отрицательный делитель, эта реализация возвращает евклидово или поэтапное по модулю, когда n > 0
.
static int mod(int a, int n){
return a<0 ? (a%n + n)%n : a%n;
}
-
mod( 5, 3)
создает2
-
mod(-5, 3)
создает1
Евклидова по модулю
static int euclideanModulo(int a, int n){
return n<0 ? euclideanModulo(a, -n) : mod(a, n);
}
-
euclideanModulo( 5, 3)
создает2
-
euclideanModulo(-5, 3)
создает1
-
euclideanModulo( 5,-3)
создает2
-
euclideanModulo(-5,-3)
создает1
Floored modulo
static int flooredModulo(int a, int n){
return n<0 ? -flooredModulo(-a, -n) : mod(a, n);
}
-
flooredModulo( 5, 3)
создает2
-
flooredModulo(-5, 3)
создает1
-
flooredModulo( 5,-3)
создает-1
-
flooredModulo(-5,-3)
создает-2