java modulo negative-number

¿La mejor forma de hacer que el módulo de Java se comporte como debería con números negativos?



modulo negative-number (5)

En Java cuando lo haces

a % b

Si a es negativo, devolverá un resultado negativo, en lugar de ajustarse a b como debería. ¿Cuál es la mejor manera de arreglar esto? La única forma en que puedo pensar es

a < 0 ? b + a : a % b



En teoría de números, el resultado es siempre positivo. Supongo que este no es siempre el caso en los lenguajes de programación porque no todos los programadores son matemáticos. Mis dos centavos, lo consideraría un defecto de diseño del lenguaje, pero no puede cambiarlo ahora.

= MOD (-4,180) = 176 = MOD (176, 180) = 176

porque 180 * (-1) + 176 = -4 lo mismo que 180 * 0 + 176 = 176

Usando el ejemplo de reloj aquí, http://mathworld.wolfram.com/Congruence.html no diría que duration_of_time mod cycle_length es -45 minutos, usted diría 15 minutos, aunque ambas respuestas satisfacen la ecuación base.


Para aquellos que aún no usan (o no pueden usar) Java 8, Guava rescató con IntMath.mod() , disponible desde Guava 11.0.

IntMath.mod( 2, 3) = 2 IntMath.mod(-2, 3) = 1

Una advertencia: a diferencia de Math.floorMod () de Java 8, el divisor (el segundo parámetro) no puede ser negativo.


Prefiero esta expresión:

a < 0 ? b - (-a) % b : a % b

Esto podría o no ser más rápido que esa otra fórmula [(a% b + b)% b], pensándolo bien. Contiene una rama que generalmente es mala con procesadores modernos, pero usa una operación de módulo menor.

En realidad, definitivamente podría ser más lento.


Se comporta como debería a% b = a - a / b * b; es decir, es el resto.

Puedes hacer (a% b + b)% b

Esta expresión funciona porque el resultado de (a % b) es necesariamente menor que b , no importa si a es positivo o negativo. La adición de b se ocupa de los valores negativos de a , ya que (a % b) es un valor negativo entre -b y 0 , (a % b + b) es necesariamente menor que b y positivo. El último módulo está allí en caso de que a positivo para empezar, ya que si a es positivo (a % b + b) sería mayor que b . Por lo tanto, (a % b + b) % b vuelve a ser más pequeño que b (y no afecta los valores negativos a ).