Была проблема при рассмотрении проверки суммы платежа за последние два дня. Я использовал метод равенства BigDecimal, чтобы сравнить, равны ли два количества, что привело к ошибке в сравнении количества (например, сравнение между 3,0 и 3,00 и т. Д.).
[Примечание. В качестве примера все приведены следующие о Sun JDK версии 1.4.2. Реализация других версий может не быть последовательной, пожалуйста, игнорируйте это]
Во -первых, давайте посмотрим на метод равенства Bigdecimal:
public boolean equals (объект x) {if (! (x ancessionof bigdecimal)) return false; bigdecimal xdec = (bigdecimal) x; return scale == xdec.scale && intval.equals (xdec.intval); }Вы можете видеть, что метод Euquals BigDecimal заключается в том, чтобы сначала определить тип данных, который должен сравниваться. Если типы объектов являются согласованными, одновременно определяется, являются ли точность (масштаб) и значение (метод равенства Biginteger).
Фактически, в Javadoc уже очень ясно: «сравнивает этот Bigdecimal с указанным объектом для равенства. В отличие от сравнения, этот метод учитывает два больших объекта, равные, только если они равны по значению и масштабе (таким образом, 2,0 не равны 2.00, когда сравнивают этот метод)». Я просто не обращал внимания!
Давайте посмотрим на метод сравнения:
public int compareto (bigdecimal val) {/ * Оптимизация: будет работать нормально без следующих трех строк */int sigdiff = signum () - val.signum (); if (sigdiff! это; arg [1] = val; matchscale (arg); return arg [0] .intval.compareto (arg [1] .intval); } Вы можете видеть, что в этом методе есть обработка соответствующего масштаба, что означает преобразование объекта с низкой точностью в высокую точность, а затем сравнивает его (также метод сравнения Biginteger). Реализация MatchScale заключается в следующем:
Private Static Void Matchscale (BigDecimal [] val) {if (val [0] .scale <val [1] .scale) val [0] = val [0] .setscale (val [1] .scale); else if (val [1] .scale <val [0]. Scale) val [1] = val [1] .setscale (val [0]. Scale); } Сделайте простой тест:
System.out.println (новый BigDecimal ("1.2"). Equals (new BigDecimal ("1.20"))); // Вывод falsesystem.out.println (new BigDecimal ("1.2"). Compareto (новый BigDecimal ("1.20")) == 0); // Вывод TRUE Также заметил, что больший конструктор выше проходит в струнах. Если пройден в типе числа, что произойдет? Вы можете проверить это самостоятельно и проанализировать причины:
System.out.println (новый BigDecimal ("1.2"). Equals (new BigDecimal ("1.20"))); // Вывод falsesystem.out.println (new BigDecimal ("1.2"). Compareto (новый BigDecimal ("1.20")) == 0); // вывод True System.out.println (новый BigDecimal (1.2). Equals (new BigDecimal ("1.20"))); // Вывод - это? System.out.println (новый BigDecimal (1.2) .compareto (новый BigDecimal ("1.20")) == 0); // Вывод? System.out.println (новый BigDecimal (1.2). Equals (новый BigDecimal (1.20))); // Вывод? System.out.println (новый BigDecimal (1.2) .compareto (новый BigDecimal (1.20)) == 0); // Вывод?Окончательный вывод: для сравнения размеров BigDecimal, использование метода Equals не только сравнит размер значения, но и сравнит точность двух объектов. Метод сравнения не сравнит точность, а только сравнит размер значения.
Наконец, я презираю себя. Я использовал Java Language в течение многих лет, и я даже не понял основной здравый смысл!
В приведенной выше статье кратко рассказывается о разнице между равными BigDecimal и сравнением в Java - это все контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.