12
votes

Java: Vérifiez si deux doubles valeurs correspondent à un nombre spécifique des décimales

Comparaison de ces deux valeurs doit entraîner une "vraie": xxx


1 commentaires

Le 53.917399999999 devrait-il comparer égal à 53,9173? Ou à 53.9174?


7 Réponses :


23
votes

Si vous voulez a = 1.00001 code> et b = 0,99999 code> être identifié comme étant égal: xxx pré>

sinon, si vous voulez 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: xxx pré>

sinon, utilisez la méthode 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);


5 commentaires

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 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 == sur des types de référence tels que bigdecimal , mais c'est une solution facile.


Cool Downvote supprimé. Ce sont de bonnes solutions pour la plupart des cas.


+1 pour le bigdecimal , 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



5
votes

naïvement: xxx

Cependant, cela ne fonctionnera pas correctement pour toutes les valeurs. Il est en fait impossible de le faire fonctionner aussi longtemps que vous utilisez double , car double est implémenté comme fractons binaires et ne les a même pas Décimales.

Vous devrez convertir vos valeurs en chaîne ou BigDecimal pour faire des tests significatifs sur leurs décimales. < 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.


1 commentaires

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 string , 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.



0
votes

merci. Je l'ai fait de cette façon: xxx


1 commentaires

Vous n'avez pas à faire une nouvelle réponse, acceptez simplement la bonne réponse.



3
votes

Apache Commons a ceci: org.apache.commons.Math3.util.Precision Equals (Double X, Double Y, Double EPS)

epsilon serait la distance que vous autoriseriez. On dirait que le vôtre serait 1e-5?

Le code source de cette méthode semble qu'il utilise des maths.abs comme suggéré dans d'autres réponses.


0 commentaires

11
votes

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;


0 commentaires

-1
votes

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;
    }
}


1 commentaires

Ceci ne renvoie que faux . Vous devez remplacer le corps de la méthode entier à retour MATH.ABS (myFirstNumber - MySecondNumber) <0,0009; .



1
votes
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;
}

2 commentaires

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.