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

167

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

BigDecimal price; // assigned elsewhere

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

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

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

Ваш Ответ

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

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

someBigDecimal.compareTo(BigDecimal.ZERO) == 0
Разрешение на кражу вашей терминологии из условия «Йода» просил.
Функция сравнения BigDecimal's по-прежнему будет выдавать исключение, если вы передадите нулевое значение.
Это не мое, погуглите это;]
This is fantastic.
Поведение Java BigDecimalequals а такжеcompareTo не так, как вы думаете.docs.oracle.com/javase/1.5.0/docs/api/java/math/…
81

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

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

я думаю, стоит упомянуть, что поведение методов 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 переменная, иначе вы получите неожиданный результат.

4

так как они являются объектами, и использовать встроенный экземпляр 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().

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

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

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

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

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

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

BigDecimal.ZERO.equals(selectPrice)

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

selectPrice.equals(BigDecimal.ZERO)

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

так что для второй строки ... если selectedPrice имеет значение null, то он просто выдаст исключение NullPointerException.
Поведение Java BigDecimalequals а такжеcompareTo не так, как вы думаете.docs.oracle.com/javase/1.5.0/docs/api/java/math/…
368

использование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

Похожие вопросы