Comparaison de ces deux valeurs doit entraîner une "vraie":
7 Réponses :
Si vous voulez sinon, si vous voulez sinon, utilisez la méthode a = 1.00001 code> et
b = 0,99999 code> être identifié comme étant égal:
a = 1.00010 code> et
b = 1.00019 code> être identifié comme étant égal, et les deux
A code> et
b code> sont positifs et non énorme:
tronquer code> comme indiqué dans y a-t-il des fonctions pour tronquer un double en Java? : p>
BigDecimal aa = new BigDecimal(a);
BigDecimal bb = new BigDecimal(b);
aa = aa.setScale(4, BigDecimal.ROUND_DOWN);
bb = bb.setScale(4, BigDecimal.ROUND_DOWN);
return aa.equals(bb);
Aimer ces types de solutions simples et brillantes!
-1. @Michael a raison. Cette solution est défectueuse. J'aimerais que votre explication de pourquoi `system.out.println (12512310271255125d == 12512310271255124d);` impressions true code> si double peut représenter des valeurs intégrales exactement. C'est une déclaration évidemment incorrecte compte tenu des autres doubles pouvant travailler. Ensuite, il y a le fait que vous ne devriez pas utiliser
== code> sur des types de référence tels que
bigdecimal code>, mais c'est une solution facile.
Cool Downvote supprimé. Ce sont de bonnes solutions pour la plupart des cas.
+1 pour le bigdecimal code>, cela fait vraiment ce qui est demandé, la fabrication est très maintenable. C'est ce qui devrait être la solution préférée jusqu'à ce que la performance ait démontré une amélioration.
(-3.17156, -3.1715) renvoie false
naïvement: Cependant, cela ne fonctionnera pas correctement pour toutes les valeurs. Il est en fait impossible de le faire fonctionner aussi longtemps que vous utilisez Vous devrez convertir vos valeurs en code> chaîne code> ou double code>, car
double code> est implémenté comme fractons binaires et ne les a même pas em> Décimales. P>
BigDecimal code> pour faire des tests significatifs sur leurs décimales. P> < p> Vous voudrez peut-être lire Guide de point flottant pour améliorer votre compréhension de votre compréhension de Comment fonctionnent les valeurs de points flottants. P> p>
Cela ne dépend pas vraiment de la façon dont vous traduisez cette ligne ...? Si vous souhaitez vérifier si ces valeurs sont égales à un certain chiffre, vous avez raison avec la solution code> string code>, mais la plupart des temps où une telle comparaison se produira, vous voulez juste le savoir Les résultats sont "assez proches" et dans ces scénarios, la ligne est jolie.
merci. Je l'ai fait de cette façon:
Vous n'avez pas à faire une nouvelle réponse, acceptez simplement la bonne réponse.
Apache Commons a ceci: org.apache.commons.Math3.util.Precision Equals (Double X, Double Y, Double EPS) P>
epsilon serait la distance que vous autoriseriez. On dirait que le vôtre serait 1e-5? p>
Le code source de cette méthode semble qu'il utilise des maths.abs comme suggéré dans d'autres réponses. p>
Voici l'exemple simple si vous en avez toujours besoin :)
public static boolean areEqualByThreeDecimalPlaces(double a, double b) { a = a * 1000; b = b * 1000; int a1 = (int) a; int b1 = (int) b; if (a1 == b1) { System.out.println("it works"); return true; } else System.out.println("it doesn't work"); return false;
La solution pour comparer deux à deux chiffres jusqu'à trois décimales et retourner true ou false peut être:
public static boolean areEqualByThreeDecimalPlaces(double myFirstNumber , double mySecondNumber){ if (Math.abs(myFirstNumber - mySecondNumber) < 0.0009 ){ return true; } else { return false; } }
Ceci ne renvoie que faux code>. Vous devez remplacer le corps de la méthode entier à
retour MATH.ABS (myFirstNumber - MySecondNumber) <0,0009; Code>.
public static boolean areEqualByThreeDecimalPlaces(double a, double b){ if(a < 0 && b < 0) { double c = Math.ceil(a * 1000) / 1000; double d = Math.ceil(b * 1000) / 1000; return c == d; } if(a > 0 && b > 0){ double c = Math.floor(a * 1000) / 1000; double d = Math.floor(b * 1000) / 1000; return c == d; } return a == b; }
Bienvenue sur Stackoverflow. S'il vous plaît expliquer votre solution.
La méthode math.floor renvoie le plus grand type de données double de type inférieur ou égal à l'argument et est égal à entier mathématique. La méthode math.Ceuil renvoie le plus petit type de données double de type supérieur ou égal à l'argument et est égal à entier mathématique. C'est pourquoi j'ai utilisé Math.Ceuil pour des nombres négatifs et des maths.floor pour des nombres positifs. si les conditions sont vraies que les chiffres sont égaux.
Le 53.917399999999 devrait-il comparer égal à 53,9173? Ou à 53.9174?