Mod en Java produce números negativos [duplicar]
Esta pregunta ya tiene una respuesta aquí:
- ¿La mejor manera de hacer que el módulo de Java se comporte como debería con números negativos? 6 respuestas
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?
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)
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. :)
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.
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))
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.
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