2016-05-31 2 views
0

Donc, cette ligne avec la faute d'erreur de précision;perte de précision possible avec mod- (mais ce n'est pas le cas)

A [i] = m% 3;

m est long A est int []; Et mon erreur est erreur: perte de précision possible A [i] = m% 3. requis int trouvé long.

Comment puis-je avoir une erreur lorsque les seules réponses possibles sont 0,1,2? N'y a-t-il pas un autre moyen que de déclarer A aussi long []? C'est un tableau potentiellement grand donc je ne le veux pas (en fait je préférerais même que A soit court []) J'ai aussi essayé l'erreur: A [i] = m% 3L, mais le même résultat.

+1

double possible de [Qu'est-ce qu'un « int » entre parenthèses signifie en donnant une valeur à un int?] (http://stackoverflow.com/questions/9875960/what-does-a-int-in-parenthesis-mean-when-givin g-a-value-to-an-int) –

+0

Java ne sait pas que vous modulez plus de 3, si c'était un nombre supérieur à 2^8 cela provoquerait une erreur car A ne peut pas contenir ce grand nombre. Ignorez-le ou transformez le modula en int: 'A [i] = (int) (m% 3);' –

Répondre

2

Le compilateur ne regarde pas le résultat, il regarde le type. Le type de m%3 est long, et vous essayez de le mettre dans un int. Donc, le compilateur est en colère, car potentiellement, la valeur stockée dans un long est plus grande que celle que vous pouvez stocker dans un int.

Pour éliminer le problème, vous devez jeter le résultat dans un int:

A[i] = (int) (m % 3); 

Cependant, vous pouvez le faire parce que vous savez le résultat est 0,1 ou 2. Si vous faites ne pas connaître la valeur de la long vous moule, vous pouvez avoir un débordement d'entier:

public static void main(String[] args) { 
    long l = Integer.MAX_VALUE + 1L; 
    System.out.println(l); 
    // 2147483648 
    System.out.println((int)l); 
    // -2147483648 
} 
+1

Même si vous écrivez System.out.println (l); sans le lancer en int, le résultat sera -2147483648. Parce que Integer.MAX_VALUE est int et 1 est aussi int. Par conséquent, le résultat de la sommation est int et il est débordé au moment de l'ajout –

+0

Bon point, édité le code approprié. –