142 votes

Mod en Java produit des nombres négatifs

Il semble que lorsque je calcule int i = -1 % 2 J'obtiens -1 en Java. En Python, j'obtiens 1. Que dois-je faire pour obtenir le même comportement en Java ?

162voto

andrewmu Points 6436

Il est assez courant dans les langages dérivés du C que le module d'un nombre négatif soit négatif. Vous pouvez trouver la valeur positive en faisant ceci :

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

ou ceci :

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)

140voto

TrudleR Points 430

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

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

2voto

Dico Points 1233
if b > 0:
    int mod = (mod = a % b) < 0 ? a + b : a;

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

2voto

amit Points 74385

Si vous avez besoin n % m alors :

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

-1voto

Neil Points 24938

Si le modulus est une puissance de 2, vous pouvez utiliser un masque de bits :

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

Par comparaison, le langage Pascal fournit deux opérateurs ; REM prend le signe du numérateur ( x REM y est x - (x DIV y) * yx DIV y est TRUNC(x / y) ) et MOD nécessite un dénominateur positif et renvoie un résultat positif.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X