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

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 

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

    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 ).

    A partir de Java 8, puede usar Math.floorMod (int x, int y) y Math.floorMod (long x, long y) . Ambos métodos devuelven los mismos resultados que la respuesta de Peter.

     Math.floorMod( 2, 3) = 2 Math.floorMod(-2, 3) = 1 Math.floorMod( 2, -3) = -1 Math.floorMod(-2, -3) = -2 

    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.

    En teoría de números, el resultado es siempre positivo. Supongo que este no es siempre el caso en los lenguajes de progtwigción porque no todos los progtwigdores 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.

    Aquí hay una alternativa:

     a < 0 ? b-1 - (-a-1) % 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 twig 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.

    (Editar: corrigió la fórmula)