Как проверить, является ли переменная BigDecimal == 0 в Java?

У меня есть следующий код на Java;

BigDecimal price; // assigned elsewhere

if (price.compareTo(new BigDecimal("0.00")) == 0) {
    return true;
}

Как лучше написать условие if?

 GriffeyDog08 июн. 2012 г., 17:09
Многие ответы предлагают использовать метод BigDecimal's .equals (). Но этот метод учитывает масштаб, поэтому он не эквивалентен использованию compareTo ().

Ответы на вопрос(9)

BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));
 07 апр. 2017 г., 10:53
Хотя этот код может ответить на вопрос, предоставляя дополнительныеcontext относительноhow и / илиwhy это решает проблему, улучшая долгосрочную ценность ответа. Помните, что вы отвечаете на вопрос для читателей в будущем, а не только для того, кто спрашивает сейчас! пожалуйстаedit Ваш ответ, чтобы добавить объяснение и дать представление о том, какие ограничения и предположения применяются. Также не помешает упомянуть, почему этот ответ более уместен, чем другие.

Существует константа, с которой вы можете проверить:

someBigDecimal.compareTo(BigDecimal.ZERO) == 0
 08 июн. 2012 г., 16:44
Это не мое, погуглите это;]
 08 июн. 2012 г., 17:13
 31 авг. 2012 г., 03:53
Поведение Java BigDecimalequals а такжеcompareTo не так, как вы думаете.docs.oracle.com/javase/1.5.0/docs/api/java/math/…
 08 июн. 2012 г., 16:44
Разрешение на кражу вашей терминологии из условия «Йода» просил.
 07 февр. 2013 г., 06:55
Функция сравнения BigDecimal's по-прежнему будет выдавать исключение, если вы передадите нулевое значение.

так как они являются объектами, и использовать встроенный экземпляр ZERO:

if(selectPrice.equals(BigDecimal.ZERO))

Обратите внимание, что.equals() учитывает масштаб, поэтому если selectPrice не имеет тот же масштаб (0), что и.ZERO тогда это вернет false.

Чтобы вывести масштаб из уравнения как бы:

if(selectPrice.compareTo(BigDecimal.ZERO) == 0)

Я должен отметить, что для определенных математических ситуаций,0.00 != 0вот почему я представляю.equals() принимает во внимание масштаб0.00 дает точность до сотого места, тогда как0 не так точно. В зависимости от ситуации вы можете придерживаться.equals().

 31 авг. 2012 г., 04:42
Ответ Эдвина Далорсо объясняет это довольно хорошо, на самом деле.equals учитывает масштаб, а это не то, что мы хотим здесь.
 31 авг. 2012 г., 04:39
Хотите объяснить, что вы имеете в виду, вместо ссылки на документы? То, что я предложил, должно работать на ФП.
 31 авг. 2012 г., 03:53
Поведение Java BigDecimalequals а такжеcompareTo не так, как вы думаете.docs.oracle.com/javase/1.5.0/docs/api/java/math/…
 31 авг. 2012 г., 14:11
@nhahtdh Спасибо за информацию, хотя есть ситуации, когдаequals should использоваться вместоcompareTo(), ОП не указывает, какой тип математики он использует, так что вы правы, лучше дать ему оба варианта.

Существует статическая константа, котораяпредставляет 0:

BigDecimal.ZERO.equals(selectPrice)

Вы должны сделать это вместо:

selectPrice.equals(BigDecimal.ZERO)

во избежание случая, когдаselectPrice являетсяnull.

 13 мар. 2019 г., 12:34
так что для второй строки ... если selectedPrice имеет значение null, то он просто выдаст исключение NullPointerException.
 31 авг. 2012 г., 03:53
Поведение Java BigDecimalequals а такжеcompareTo не так, как вы думаете.docs.oracle.com/javase/1.5.0/docs/api/java/math/…
Решение Вопроса

использованиеcompareTo(BigDecimal.ZERO) вместоequals():

if (price.compareTo(BigDecimal.ZERO) == 0) // see below

Сравнивая сBigDecimal постояннаяBigDecimal.ZERO избегает необходимости строитьnew BigDecimal(0) каждое исполнение.

FYI,BigDecimal также имеет константыBigDecimal.ONE а такжеBigDecimal.TEN для вашего удобства.

Note!

Причина, по которой вы не можете использоватьBigDecimal#equals() это то, что нужноscale во внимание:

new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!

поэтому он не подходит для чисто числового сравнения. Тем не мение,BigDecimal.compareTo() не учитывает масштаб при сравнении:

new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true

Просто хочу поделиться здесь некоторыми полезными расширениями для kotlin

fun BigDecimal.isZero() = compareTo(BigDecimal.ZERO) == 0
fun BigDecimal.isOne() = compareTo(BigDecimal.ONE) == 0
fun BigDecimal.isTen() = compareTo(BigDecimal.TEN) == 0

С другой стороны,сигнум () может быть использован:

if (price.signum() == 0) {
    return true;
}
 06 апр. 2017 г., 16:16
@ WeGa Это неправда:BigDecimal.ZERO.compareTo(null) скину NPE
 06 мар. 2014 г., 11:46
Может быть, это быстрее, но CompareTo (BigDecimal.ZERO) более читабельно.
 12 окт. 2013 г., 20:27
Best & amp; самый быстрый способ. Это должен быть правильный ответ.
 18 окт. 2016 г., 10:10
К сожалению, signum () не является нулевым-безопасным, тогда как CompareTo, при сравнении, как BigDecimal.ZERO.compareTo (), так что обратите внимание на это
 10 апр. 2017 г., 10:01
@ACV, спасибо за вашу бдительность. Посмотрев исходный код, compareTo () действительно ожидает только ненулевой аргумент.

я думаю, стоит упомянуть, что поведение методов equals и compareTo в классе BigDecimalне согласуются друг с другом.

Это в основном означает, что:

BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO)==0); //true
System.out.println(someValue.equals(BigDecimal.ZERO)); //false

Поэтому вы должны быть очень осторожны с масштабом в вашемsomeValue переменная, иначе вы получите неожиданный результат.

Я обычно использую следующее:

if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }

Ваш ответ на вопрос