Si vous voulez a = 1.00001 et b = 0.99999 être identifiés comme des égaux:
returnMath.abs(a - b)<1e-4;
Sinon, si vous voulez a = 1.00010 et b = 1.00019 être identifiés comme des égaux, et les deux a et b sont positifs et pas énorme:
returnMath.floor(a *10000)==Math.floor(b *10000);//compare by == is fine here because both sides are integral values.//double can represent integral values below 2**53 exactly.
BigDecimal aa =newBigDecimal(a);BigDecimal bb =newBigDecimal(b);
aa = aa.setScale(4,BigDecimal.ROUND_DOWN);
bb = bb.setScale(4,BigDecimal.ROUND_DOWN);return aa.equals(bb);
L'amour de ces types de solutions, simple et génial! @monoceres: ...et mal -1. @Michael est à droite. Cette solution est erronée. J'aimerais votre explication sur le Système.out.println(12512310271255125d == 12512310271255124d);` impression de true si double peut représenter des valeurs entières exactement. C'est évidemment un état incorrect compte tenu de l'ampleur des doubles pouvez travailler avec. Ensuite, il ya le fait que vous ne devriez pas être à l'aide de == sur les types de référence comme BigDecimal, mais c'est une solution facile. Oups fixe. Cool downvote supprimé. Ils sont de bonnes solutions pour la plupart des cas.
Cependant, cela ne va pas fonctionner correctement pour toutes les valeurs. Il est en fait impossible de le faire fonctionner aussi longtemps que vous utilisez double, parce que double est mis en œuvre sous forme binaire fractons et n'a même pas ont décimales.
Vous devrez convertir vos valeurs à String ou BigDecimal à faire des tests sur leurs décimales.
Vous voudrez peut-être lire la virgule Flottante Guide pour améliorer votre compréhension de la façon dont les valeurs de virgule flottante de travail.
Ne marche pas vraiment dépendre de la façon dont vous traduire cette ligne...? Si vous voulez vérifier si ces valeurs sont égales, jusqu'à un certain chiffre, vous avez raison avec la String solution, mais la plupart du temps, lorsqu'une telle comparaison va se produire, vous voulez juste savoir ce que les résultats sont "assez proche", et dans ces scénarios, la ligne est plutôt droite.
Si vous voulez
a = 1.00001
etb = 0.99999
être identifiés comme des égaux:Sinon, si vous voulez
a = 1.00010
etb = 1.00019
être identifiés comme des égaux, et les deuxa
etb
sont positifs et pas énorme:Sinon, utilisez la
truncate
méthode comme indiqué dans Existe-il des fonctions pour la troncature d'un double en java?:@monoceres: ...et mal
-1. @Michael est à droite. Cette solution est erronée. J'aimerais votre explication sur le Système.out.println(12512310271255125d == 12512310271255124d);` impression de
true
si double peut représenter des valeurs entières exactement. C'est évidemment un état incorrect compte tenu de l'ampleur des doubles pouvez travailler avec. Ensuite, il ya le fait que vous ne devriez pas être à l'aide de==
sur les types de référence commeBigDecimal
, mais c'est une solution facile.Oups fixe.
Cool downvote supprimé. Ils sont de bonnes solutions pour la plupart des cas.
OriginalL'auteur kennytm
voici l'exemple simple, si vous avez encore besoin de cela 🙂
OriginalL'auteur Norby
Naïvement:
Cependant, cela ne va pas fonctionner correctement pour toutes les valeurs. Il est en fait impossible de le faire fonctionner aussi longtemps que vous utilisez
double
, parce quedouble
est mis en œuvre sous forme binaire fractons et n'a même pas ont décimales.Vous devrez convertir vos valeurs à
String
ouBigDecimal
à faire des tests sur leurs décimales.Vous voudrez peut-être lire la virgule Flottante Guide pour améliorer votre compréhension de la façon dont les valeurs de virgule flottante de travail.
String
solution, mais la plupart du temps, lorsqu'une telle comparaison va se produire, vous voulez juste savoir ce que les résultats sont "assez proche", et dans ces scénarios, la ligne est plutôt droite.OriginalL'auteur Michael Borgwardt
Apache commons a ceci:
org.apache.commons.math3.util.La précision est égale à(double x, double y, double eps)
epsilon serait la distance, vous permettre. Ressemble à la vôtre serait 1e-5?
Le code source de cette méthode ressemble, il utilise les Mathématiques.abs comme suggéré dans d'autres réponses.
OriginalL'auteur DaveEdelstein
Grâce. J'ai fait de cette façon:
OriginalL'auteur tzippy