Mod en Java produce números negativos [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Cuando calculo int i = -1 % 2 obtengo -1 en Java. En Python, obtengo 1 como resultado de -1 % 2. ¿Qué tengo que hacer para obtener el mismo comportamiento en Java con la función modulo?

 114
Author: Christian, 2011-03-22

5 answers

El problema aquí es que en Python el operador % devuelve el módulo y en Java devuelve el resto . Estas funciones dan los mismos valores para argumentos positivos, pero el módulo siempre devuelve resultados positivos para entrada negativa, mientras que el resto puede dar resultados negativos. Hay más información al respecto en esta pregunta.

Puedes encontrar el valor positivo haciendo esto:

int i = (((-1 % 2) + 2) % 2)

O esto:

int i = -1 % 2;
if (i<0) i += 2;

(obviamente -1 o 2 puede ser lo que quieras que sea el numerador o denominador)

 135
Author: andrewmu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:02

Desde Java 8 puedes usar la matemática .floorMod () método:

Math.floorMod(-1, 2); //== 1

Nota: Si el valor del módulo (aquí 2) es negativo, todos los valores de salida también serán negativos. :)

Fuente: https://stackoverflow.com/a/25830153/2311557

 80
Author: codepleb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:44
if b > 0:
    int mod = (mod = a % b) < 0 ? a + b : a;

No utiliza el operador % dos veces.

 2
Author: Dico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-16 06:32:50

Si necesitas n % m entonces:

int i = (n < 0) ? (m - (abs(n) % m) ) %m : (n % m);

Explicación matemática:

n = -1 * abs(n)
-> n % m = (-1 * abs(n) ) % m
-> (-1 * (abs(n) % m) ) % m
-> m - (abs(n) % m))
 1
Author: amit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-16 13:47:56

Si el módulo es una potencia de 2 entonces puedes usar una máscara de bits:

int i = -1 & ~-2; // -1 MOD 2 is 1

En comparación, el lenguaje Pascal proporciona dos operadores; REM toma el signo del numerador (x REM y es x - (x DIV y) * y donde x DIV y es TRUNC(x / y)) y MOD requiere un denominador positivo y devuelve un resultado positivo.

 -2
Author: Neil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-22 00:15:56