问题
Consider the simple test class:
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\");
}
}
You can (consciously) say that x
is equal to y
(not object reference), but when you run the program, the following result shows:
false
true
Question: What\'s the difference between compareTo()
and equals()
in BigDecimal
that compareTo
can determine that x
is equal to y
?
PS: I see that BigDecimal has an inflate()
method on equals()
method. What does inflate()
do actually?
回答1:
The answer is in the JavaDoc of the equals() method:
Unlike compareTo, this method considers two
BigDecimal
objects equal only if they are equal in value and scale (thus 2.0 is not equal to 2.00 when compared by this method).
In other words: equals()
checks if the BigDecimal
objects are exactly the same in every aspect. compareTo()
"only" compares their numeric value.
回答2:
I see that BigDecimal has an inflate() method on equals() method. What does inflate() do actually?
Basically, inflate()
calls BigInteger.valueOf(intCompact)
if necessary, i.e. it creates the unscaled value that is stored as a BigInteger
from long intCompact
. If you don't need that BigInteger
and the unscaled value fits into a long
BigDecimal
seems to try to save space as long as possible.
回答3:
You can also compare with double value
BigDecimal a= new BigDecimal("1.1"); BigDecimal b =new BigDecimal("1.1");
System.out.println(a.doubleValue()==b.doubleValue());
来源:https://stackoverflow.com/questions/6787142/bigdecimal-equals-versus-compareto