2017-05-23 1 views
2

Ce code fonctionne bien maintenant mais donnera-t-il des réponses correctes dans tous les cas?Est-il correct de comparer le modulo de deux valeurs doubles avec un entier en Java?

Voici mon code:

double val1 = 0.75; 
double val2 = 0.25; 

if(val1 % val2 == 0){ 
    // do something 
} 
+0

Cela dépend de ce que la condition est. Si vous voulez vérifier isCompeletly divisible, vous devriez vérifier Zero. – Mritunjay

+2

Je ne sais pas ce que vous considérez comme "mathématiquement correct"; [section 15.17.3] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.17.3) de la spécification du langage Java explique exactement ce que le '% 'l'opérateur calcule. Lisez cela et décidez par vous-même si cela correspond à vos attentes. – Jesper

+0

question @Jesper édité, je veux dire va-t-il donner des réponses correctes dans tous les cas, parce que j'ai trouvé que 3,9% 0,1 donne une mauvaise réponse –

Répondre

1

Comme mentionné dans d'autres réponses, vous devriez comparer avec une petite valeur plutôt que d'un nombre entier, la raison est:

Tenir compte il deux valeurs: 1.0 and 0.1. Si vous faites 1.0 % 0.1, cela donnera 0.09999999999999995, à cause d'une erreur d'arrondi. Donc ici si vous comparez avec Integer, cela retournera faux.

Ainsi que mentionné dans la réponse de @MauricePerry, suivant est la meilleure pratique.

Math.abs(val1 % val2) < EPSILON //where EPSILON is a small value 
+0

Puis-je faire (Math.abs (val1% val2) == 0) –

+0

Sa même que vous faisiez précédemment. Math.abs() est pour la valeur absolue. @AnkurLathiya – Kaushal28

+0

faire quelque chose comme: 'Math.abs (val1% val2) <0.0001' – Kaushal28

0

Je ne ferais pas ça: pour ces valeurs, le résultat peut être correct, mais probablement pas avec, par exemple 0,6 et 0,2.

MISE À JOUR

BTW: l'entier vous comparez le modulo avec (0) sera converti en un double avant la comparaison.

+0

Je fais toujours modulo avec 0,25 –

+0

@AnkurLathiya Je ne ferais pas cela –

+0

que devrais-je" si (val1% val2 == 0) "avec un meilleur –

0

Oui!

%, également connu sous le nom d'opérateur de module ou de reste. L'opérateur% renvoie le reste de deux nombres. Par exemple 10% 3 est 1 parce que 10 divisé par 3 laisse un reste de 1. pour plus: go through this link