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()?

Author: Jonas, 2011-07-22

3 answers

Odpowiedź znajduje się w JavaDoc metody equals() :

compareTo, metoda ta uwzględnia dwa obiekty BigDecimal 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ą.

 174
Author: Joachim Sauer,
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.

 1
Author: Thomas,
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());
 -3
Author: Rashmi singh,
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