Рассмотрим простой тестовый класс:
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()
самом деле?
java
equals
bigdecimal
compareto
Бухаке синди
источник
источник
inflate()
: оно не является частью общедоступного API, поскольку оно манипулирует только внутренним представлением и не оказывает видимого влияния на «внешнее». Поэтому, если вы действительно не хотитеBigDecimal
углубленно изучать реализацию , я бы посоветовал вам игнорировать этот метод.Ответы:
Ответ находится в JavaDoc
equals()
метода :Другими словами:
equals()
проверяет, являются лиBigDecimal
объекты абсолютно одинаковыми во всех аспектах.compareTo()
«only» сравнивает их числовое значение.Относительно того, почему
equals()
ведет себя так, на этот вопрос был дан ответ .источник
BigDecimal
если вы не будете внимательно читать JavaDoc. :) - Мы получили несколько странных ошибок, пока не поняли разницу.BigDecimal
одна такая вещь. Поэтому всегда следует проверять JavaDoc. По крайней мере, когда вы узнаете, что-то странное происходит.По сути,
inflate()
вызываетBigInteger.valueOf(intCompact)
при необходимости, то есть создает немасштабированное значение, которое сохраняется какBigInteger
отlong intCompact
. Если вам это не нужно,BigInteger
и немасштабированное значение вписывается в,long
BigDecimal
кажется, попытаться сэкономить место как можно дольше.источник
BigDecimal
сохраняет его немасштабированное значение как в a,long
так и в aBigInteger
. ЕслиBigInteger
внутренне не нужно, оно не создается, но если это необходимо (например, когдаequals
встречается надутый и не надутыйBigDecimal)
inflate () `, используется для его создания. - Подводя итог:inflate()
обрабатывает внутренние преобразования, если необходимо, и так как является частным, это не должно иметь значения для пользователей классаЯ считаю, что правильным ответом было бы сделать так, чтобы два числа (BigDecimals) имели одинаковую шкалу, и тогда мы могли бы принять решение об их равенстве. Например, равны ли эти два числа?
Ну, это зависит от масштаба. По шкале 5 (5 знаков после запятой) нет, они не совпадают. но на меньшей десятичной точности (шкала 4 и ниже) они считаются равными. Поэтому я предлагаю сделать шкалу двух чисел равной, а затем сравнить их.
источник
Вы также можете сравнить с двойным значением
источник