Rozważmy prostą klasę testową:
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");
}
}
Możesz (świadomie) powiedzieć, że x
to jest równe y
(nie odwołanie do obiektu), ale po uruchomieniu programu zobaczysz następujący wynik:
false
true
Pytanie: Jaka jest różnica między compareTo()
i equals()
w BigDecimal
tym, że compareTo
można określić, że x
jest równa y
?
PS: Widzę, że BigDecimal ma inflate()
metodę na equals()
metodę. Co inflate()
właściwie robi?
java
equals
bigdecimal
compareto
Buhake Sindi
źródło
źródło
inflate()
: nie jest częścią publicznego API, ponieważ manipuluje tylko wewnętrzną reprezentacją i nie ma widocznego wpływu na „zewnątrz”. Więc jeśli naprawdę nie chceszBigDecimal
dogłębnie przestudiować implementacji , proponuję zignorować tę metodę.Odpowiedzi:
Odpowiedź znajduje się w JavaDoc
equals()
metody :Innymi słowy:
equals()
sprawdza, czyBigDecimal
obiekty są dokładnie takie same pod każdym względem.compareTo()
„tylko” porównuje ich wartość liczbową.Co do tego, dlaczego
equals()
zachowuje się w ten sposób, odpowiedź na to pytanie prejudycjalne została udzielona .źródło
BigDecimal
jeśli nie przeczytasz uważnie JavaDoc. :) - Mamy z tego jakieś dziwne błędy, dopóki nie zauważyliśmy różnicy.BigDecimal
to jedna taka rzecz. Dlatego zawsze należy sprawdzić JavaDoc. Przynajmniej kiedy się dowiesz, że dzieje się coś dziwnego.Zasadniczo
inflate()
wywołuje wBigInteger.valueOf(intCompact)
razie potrzeby, tj. Tworzy nieskalowaną wartość, która jest przechowywana jakoBigInteger
fromlong intCompact
. Jeśli tego nie potrzebujesz,BigInteger
a nieskalowana wartość pasuje do a,long
BigDecimal
wydaje się, że staraj się oszczędzać miejsce tak długo, jak to możliwe.źródło
BigDecimal
zachowuje swoją nieskalowaną wartośćlong
zarówno w aBigInteger
. JeśliBigInteger
nie jest potrzebne wewnętrznie, nie jest tworzone, ale jeśli jest potrzebne (np. Gdyequals
napotyka napompowane i nienadmuchaneBigDecimal)
inflate () `jest używane do jego utworzenia. - Podsumowując:inflate()
obsługuje konwersje wewnętrzne w razie potrzeby i ponieważ jest prywatne, nie powinno mieć znaczenia dla użytkowników tej klasyUważam, że poprawną odpowiedzią byłoby uczynienie tych dwóch liczb (BigDecimals) tą samą skalą, a następnie możemy zdecydować o ich równości. Na przykład, czy te dwie liczby są równe?
To zależy od skali. Na skali 5 (5 miejsc po przecinku) nie, to nie to samo. ale przy mniejszych dokładnościach dziesiętnych (skala 4 i niższa) są uważane za równe. Dlatego proponuję, aby skala tych dwóch liczb była równa, a następnie je porównać.
źródło
Możesz także porównać z podwójną wartością
źródło