Comment java module de calculs avec des nombres négatifs?

est-ce que je fais le mauvais module? Parce qu'en Java -13 % 64 est censé évaluer à -13 mais je reçois 51 .

84
demandé sur CharlesB 2010-12-10 00:57:28

14 réponses

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

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

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

de même, si vous utilisez une langue qui renvoie un nombre négatif sur un input négatif et que vous préférez positif:

int r = x % n;
if (r < 0)
{
    r += n;
}
97
répondu Mark Byers 2010-12-09 23:18:17

puisque "mathématiquement" les deux sont corrects:

-13 % 64 = -13 (on modulus 64)  
-13 % 64 = 51 (on modulus 64)

une des options devait être choisie par les développeurs Java language et ils ont choisi:

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

dit en Java specs:

https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3

68
répondu Caner 2015-05-19 08:31:20

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

19
répondu Keyxeq 2011-01-09 10:44:41

votre résultat est erroné pour Java. S'il vous plaît fournir un certain contexte comment vous y êtes arrivé (votre programme, la mise en œuvre et la version de Java).

From the Java Language Specification

15.17.3 Opérateur Du Reste %

[...]

L'opération du reste pour les opérandes qui sont des entiers après la promotion numérique binaire (§5.6.2) produit une valeur de résultat telle que (a/B)*b+(A%b) est égal à un.
15.17.2 Exploitant De La Division /

[...]

La division entière tourne vers 0.

étant donné que / est arrondi à zéro (résultant en zéro), le résultat en % doit être négatif dans ce cas.

14
répondu starblue 2016-12-11 21:22:55

vous pouvez utiliser

(x % n) - (x < 0 ? n : 0);
5
répondu ruslik 2013-12-27 14:54:39

votre réponse est dans wikipedia: modulo

il est dit, Qu'en Java le signe sur l'opération modulo est le même que celui de dividende. et puisque nous parlons du reste de l'opération de la division est très bien, qu'il retourne -13 dans votre cas, depuis -13/64 = 0. - 13-0 = -13.

EDIT: Désolé, mal compris votre question...Tu as raison, java devrait donner -13. Pouvez-vous fournir plus de code d'environnement?

3
répondu Nava Carmon 2010-12-09 22:06:02

modulo arithmétique avec opérandes négatives est défini par le concepteur de langage, qui pourrait le laisser à l'implémentation de la langue, qui pourrait reporter la définition à L'architecture CPU.

Je n'ai pas trouvé de définition du langage Java.

Merci Ishtar, Java Language spécification pour le reste opérateur % dit que le signe du résultat est le même que le signe de la numérateur.

2
répondu wallyk 2012-06-05 08:30:43

pour surmonter cela, vous pouvez ajouter 64 (ou quelle que soit votre base de module) à la valeur négative jusqu'à ce qu'elle soit positive

int k = -13;
int modbase = 64;

while (k < 0) {
    k += modbase;
}

int result = k % modbase;

Le résultat sera toujours dans la même classe d'équivalence.

1
répondu Andreas 2010-12-09 22:07:19

x = x + m = x - m dans le module m .

donc -13 = -13 + 64 dans le module 64 et -13 = 51 dans le module 64 .

supposons Z = X * d + r , si 0 < r < X alors dans la division Z/X nous appelons r le reste.

Z % X retourne le reste de Z/X .

1
répondu 2010-12-09 22:09:50

la fonction mod est définie comme la quantité par laquelle un nombre dépasse le plus grand multiple entier du diviseur qui n'est pas plus grand que ce nombre. Donc dans votre cas de

-13 % 64

le plus grand nombre entier multiple de 64 qui ne dépasse pas -13 est -64. Maintenant, quand vous soustrayez -13 de -64 il égale 51 -13 - (-64) = -13 + 64 = 51

1
répondu Salman Paracha 2010-12-09 22:09:56

dans ma version de Java JDK 1.8.0_05 -13% 64=-13

vous pouvez essayer de la -13-(int(-13/64)) en d'autres termes, ne division mouler à un entier pour se débarrasser de la partie fraction puis soustraire numérateur Ainsi le numérateur - (int (numérateur / dénominateur)) devrait donner le reste correct et le signe

0
répondu Robert Green 2015-03-12 02:00:14

en Java les dernières versions vous obtenez -13%64 = -13 . La réponse aura toujours un signe de numérateur.

0
répondu vsn harish rayasam 2015-09-23 15:41:09

selon la section 15.17.3 du JLS, "l'opération de reste pour les opérandes qui sont des entiers après la promotion numérique binaire produit une valeur de résultat telle que (A/b)*b+(A%b) est égale à A. Cette identité tient même dans le cas particulier que le dividende est l'entier négatif de la plus grande grandeur possible pour son type et le diviseur est -1 (le reste est 0)."

Espère que ça aide.

0
répondu kudesiaji 2016-04-14 14:09:42

Je ne pense pas que Java retourne 51 dans ce cas. J'exécute Java 8 sur un Mac et j'obtiens:

-13 % 64 = -13

programme:

public class Test {
    public static void main(String[] args) {
        int i = -13;
        int j = 64;
        System.out.println(i % j);
    }
}
-1
répondu ceprateek 2014-06-23 15:38:42