web-dev-qa-db-fra.com

Mod in Java produit des nombres négatifs

Quand je calcule int i = -1 % 2 Je reçois -1 en Java. En Python, je reçois 1 à la suite de -1 % 2. Que dois-je faire pour obtenir le même comportement dans Java avec la fonction modulo?

130
Christian

Le problème ici est que dans Python, l'opérateur% renvoie le module et dans Java il renvoie le reste . Ces fonctions donnent les mêmes valeurs pour les arguments positifs, mais le module renvoie toujours des résultats positifs pour les entrées négatives, alors que le reste peut donner des résultats négatifs. Il y a plus d'informations à ce sujet dans cette question .

Vous pouvez trouver la valeur positive en faisant ceci:

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

ou ca:

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

(évidemment -1 ou 2 peut être ce que vous voulez que le numérateur ou le dénominateur soit)

156
andrewmu

Depuis Java 8 vous pouvez utiliser la méthode Math.floorMod () :

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

Remarque: Si la valeur modulo (ici 2) est négatif, toutes les valeurs de sortie seront également négatives. :)

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

93
codepleb

Si tu as besoin n % m puis:

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

explication mathématique:

n = -1 * abs(n)
-> n % m = (-1 * abs(n) ) % m
-> (-1 * (abs(n) % m) ) % m
-> m - (abs(n) % m))
2
amit
if b > 0:
    int mod = (mod = a % b) < 0 ? a + b : a;

N'utilise pas le % opérateur deux fois.

2
Dico