BigDecimal равно() по сравнению с compareTo()

Рассмотрим простой тестовый класс:

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");
    }

}

Вы можете (сознательно) сказать, что x равно y (не ссылка на объект), но когда вы запускаете программу, следующий результат показывает:

false
true

Вопрос: Какая разница между compareTo() и equals() в BigDecimal, что compareTo может определить, что x равно y?

PS: Я вижу, что BigDecimal имеет метод inflate() по методу equals(). Что делает inflate() на самом деле?

Ответ 1

Ответ находится в JavaDoc метода equals():

В отличие от compareTo, этот метод рассматривает два объекта BigDecimal равными, только если они равны по значению и масштабу (таким образом, 2.0 не равен 2,00 при сравнении этим методом).

Другими словами: equals() проверяет, являются ли объекты BigDecimal точно одинаковыми в каждом аспекте. compareTo() "only" сравнивает их числовое значение.

Ответ 2

Я вижу, что BigDecimal имеет метод inflate() для метода equals(). Что действительно надувает()?

В принципе, inflate() при необходимости вызывает BigInteger.valueOf(intCompact), то есть создает немасштабированное значение, которое хранится как BigInteger из long intCompact. Если вам не понадобится BigInteger, а значение без масштабирования вставляется в long BigDecimal, похоже, попытается сэкономить место как можно дольше.

Ответ 3

Вы также можете сравнить с двойным значением

BigDecimal a= new BigDecimal("1.1"); BigDecimal b =new BigDecimal("1.1");
System.out.println(a.doubleValue()==b.doubleValue());