web-dev-qa-db-fra.com

BigDecimal est égal à () vs compareTo ()

Considérons la classe de test simple:

import Java.math.BigDecimal;

/**
 * @author The Elite Gentleman
 *
 */
public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BigDecimal x = new BigDecimal("1");
        BigDecimal y = new BigDecimal("1.00");
        System.out.println(x.equals(y));
        System.out.println(x.compareTo(y) == 0 ? "true": "false");
    }

}

Vous pouvez (consciemment) dire que x est égal à y (pas de référence d'objet), mais lorsque vous exécutez le programme, le résultat suivant s'affiche:

false
true

Question: Quelle est la différence entre compareTo() et equals() dans BigDecimal que compareTo puisse déterminer que x est égal à y?

PS: Je vois que BigDecimal a une méthode inflate() sur la méthode equals(). Que fait réellement inflate()?

139
Buhake Sindi

La réponse est dans le JavaDoc de la méthode equals() :

Contrairement à compareTo , cette méthode considère que deux objets BigDecimal ne sont égaux que s'ils sont égaux en valeur et en échelle (donc 2.0 n'est pas égal à 2.00 comparé avec cette méthode) .

En d'autres termes: equals() vérifie si les objets BigDecimal sont exactement identiques chaque aspect . compareTo() "seulement" compare leur valeur numérique.

196
Joachim Sauer

Je vois que BigDecimal a une méthode inflate () sur la méthode equals (). Que fait réellement gonfler ()?

Fondamentalement, inflate() appelle BigInteger.valueOf(intCompact) si nécessaire, c'est-à-dire qu'il crée la valeur non mise à l'échelle stockée sous la forme d'un BigInteger à partir de long intCompact. Si vous n'en avez pas besoin, BigInteger et que la valeur non échelonnée s'inscrit dans un longBigDecimal semble essayer de gagner de la place le plus longtemps possible.

1
Thomas