108 votes

Comment java effectue-t-il des calculs de module avec des nombres négatifs?

Est-ce que je fais le mauvais module? Parce qu'en Java, -13 % 64 est supposé s'évaluer à -13 mais j'obtiens 51 .

112voto

Mark Byers Points 318575

Les deux définitions du module des nombres négatifs sont utilisées - certaines langues utilisent une définition et l’autre.

Si vous voulez obtenir un nombre négatif pour les entrées négatives, vous pouvez utiliser ceci:

 int r = x % n;
if (r > 0 && x < 0)
{
    r -= n;
}
 

De même, si vous utilisiez une langue qui renvoie un nombre négatif sur une entrée négative et que vous préférez positif:

 int r = x % n;
if (r < 0)
{
    r += n;
}
 

80voto

Caner Points 15625

Puisque "mathématiquement" les deux sont corrects:

 -13 = -13 (in modulus 64)  
-13 = 51 (in modulus 64)
 

Une des options devait être choisie par les développeurs de langage Java et il a été décidé que:

..., le signe du résultat est égal au signe du dividende.

Dit dans les spécifications Java:

http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.17.3

22voto

Keyxeq Points 121

Êtes-vous sûr de travailler en Java? Parce que Java donne -13% 64 = -13 comme prévu. Le signe du dividende!

14voto

starblue Points 29696

Votre résultat est mauvais pour Java. Veuillez fournir un contexte comment vous êtes arrivé à (votre programme, la mise en œuvre et la version de Java).

À partir de la Spécification du Langage Java

15.17.3 Reste De L'Opérateur %
[...]
Le reste de l'opération pour les opérandes sont des entiers après binaire numérique de promotion (§5.6.2) produit un résultat de valeur tels que (a/b)*b+(a%b) est égal à un.
15.17.2 Opérateur De Division /
[...]
Division entière tours vers 0.

Puisque / est arrondi vers zéro (résultant de zéro), le résultat d' % devrait être négatif dans ce cas.

6voto

ruslik Points 8442

vous pouvez utiliser

 (x % n) - (x < 0 ? n : 0);
 

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