Considérez 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
c'est égal à y
(pas une 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
qui compareTo
peut déterminer qui x
est égal à y
?
PS: Je vois que BigDecimal a une inflate()
méthode sur la equals()
méthode. Que fait inflate()
-il réellement?
java
equals
bigdecimal
compareto
Buhake Sindi
la source
la source
inflate()
: elle ne fait pas partie de l'API publique car elle ne manipule que la représentation interne et n'a aucun effet visible vers "l'extérieur". Donc, à moins que vous ne souhaitiez vraiment étudier la miseBigDecimal
en œuvre en profondeur, je vous suggère d'ignorer cette méthode.Réponses:
La réponse se trouve dans le JavaDoc de la
equals()
méthode :En d'autres termes:
equals()
vérifie si lesBigDecimal
objets sont exactement les mêmes dans tous les aspects.compareTo()
"seulement" compare leur valeur numérique.Quant à savoir pourquoi
equals()
se comporte de cette façon, cela a été répondu dans cette question SO .la source
BigDecimal
si vous ne lisez pas attentivement le JavaDoc. :) - Nous avons eu quelques bugs étranges jusqu'à ce que nous réalisions la différence.BigDecimal
est une telle chose. Par conséquent, il faut toujours vérifier le JavaDoc. Au moins une fois, vous découvrez que quelque chose d'étrange se passe.Fondamentalement,
inflate()
appelleBigInteger.valueOf(intCompact)
si nécessaire, c'est-à-dire qu'il crée la valeur non mise à l'échelle qui est stockée en tant queBigInteger
fromlong intCompact
. Si vous n'en avez pas besoinBigInteger
et que la valeur non mise à l'échelle s'insère dans unlong
BigDecimal
semble essayer d'économiser de l'espace le plus longtemps possible.la source
BigDecimal
conserve en interne sa valeur non mise à l'échelle dans along
ainsi que dans aBigInteger
. Si leBigInteger
n'est pas nécessaire en interne, il n'est pas créé mais s'il est nécessaire (par exemple, quand ilequals
rencontre un gonflé et un gonflé gonfléBigDecimal)
() `est utilisé pour le créer. - Pour résumer:inflate()
gère les conversions internes si nécessaire et depuis est privé, cela ne devrait pas avoir d'importance pour les utilisateurs de la classe.Je crois que la bonne réponse serait de faire en sorte que les deux nombres (BigDecimals) aient la même échelle, alors nous pourrons décider de leur égalité. Par exemple, ces deux nombres sont-ils égaux?
Eh bien, cela dépend de l'échelle. Sur l'échelle 5 (5 décimales), non, ce ne sont pas les mêmes. mais sur des précisions décimales plus petites (échelle 4 et inférieure), ils sont considérés comme égaux. Je suggère donc de rendre l'échelle des deux nombres égale, puis de les comparer.
la source
Vous pouvez également comparer avec une valeur double
la source