BigDecimal equals () versus compareTo()
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 {[2] } jest równe y
(nie odniesienie do obiektu), ale po uruchomieniu programu, następujący wynik pokazuje:
false
true
Pytanie: Jaka jest różnica między compareTo()
a equals()
w BigDecimal
, że compareTo
może określić, że x
jest równe y
?
PS: widzę, że BigDecimal ma metodę inflate()
na equals()
metodzie. Co właściwie robi inflate()
?
3 answers
Odpowiedź znajduje się w JavaDoc metody equals()
:
compareTo
, metoda ta uwzględnia dwa obiektyBigDecimal
równe tylko wtedy, gdy są równe pod względem wartości i skali (zatem 2.0 nie jest równe 2.00 w porównaniu z tą metodą).
Innymi słowy: equals()
sprawdza, czy BigDecimal
obiekty są dokładnie w każdy aspekt jest taki sam. compareTo()
" only " porównuje ich wartość liczbową.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-22 07:59:04
Widzę, że BigDecimal ma metodę inflate() na equals (). Co właściwie robi inflate ()?
Zasadniczo, inflate()
w razie potrzeby wywołuje BigInteger.valueOf(intCompact)
, tzn. tworzy bezskalowaną wartość, która jest przechowywana jako BigInteger
z long intCompact
. Jeśli nie potrzebujesz tego BigInteger
, a wartość bezskalowana pasuje do long
BigDecimal
wydaje się, że stara się zaoszczędzić miejsce tak długo, jak to możliwe.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-22 08:18:51
Można również porównać z podwójną wartością
BigDecimal a= new BigDecimal("1.1"); BigDecimal b =new BigDecimal("1.1");
System.out.println(a.doubleValue()==b.doubleValue());
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-15 11:39:14