Сравните, если BigDecimal больше нуля

245

Как я могу сравнить, если BigDecimalзначение больше нуля?

Santhosh
источник
1
Загляните в github.com/mortezaadi/bigdecimal-utils, там есть метод isPositive (), есть также, как is (bigdecimal) .isZero (); есть (BigDecimal) .notZero (); есть (BigDecimal) .isPositive (); // больше нуля is (bigdecimal) .isNegative (); // меньше нуля is (bigdecimal) .isNonPositive (); // меньше или равно нулю is (bigdecimal) .isNonNegative ();
Мортеза Ади
@MortezaAdi, поскольку BigDecimalреализует Comparableфункции сравнения, как lt, le, eq, neлучше перенести в ComparableUtils. Таким образом, они могут быть использованы для любых других классов, таких как Dateили пользовательских типов.
djmj
Требования @djmj определяют реализацию, нет необходимости и намерения создавать ComparableUtils. Кроме того, функциональность lt, le, eq и т. Д. Полностью отличается от универсальной.
Мортеза Ади

Ответы:

401

Это так просто, как:

if (value.compareTo(BigDecimal.ZERO) > 0)

ДокументацияcompareTo фактически устанавливается , что он возвращает -1, 0 или 1, но более общий Comparable<T>.compareToметод гарантирует только меньше нуля, равен нулю или больше нуля для соответствующих трех случаях - так что я обычно просто придерживаться этого сравнения.

Джон Скит
источник
50
Требуется дополнительное слово предупреждения. Предположим, что valueимеет значение ноль, но ненулевой масштаб (например, он оценивает 0.00вместо 0). Вы, вероятно, хотите считать, что он равен нулю. compareTo()Метод действительно будет делать это. Но equals()метод не будет. (Еще одно доказательство, если таковые были необходимы, что Локи или один из его аватаров живы и здоровы и перешли к разработке программного обеспечения.)
Эндрю Спенсер
9
Хотя я согласен с тем, что это идиоматическое решение в Java, я не думаю, что оно действительно читабельно. Каждый раз, когда я сталкиваюсь с таким выражением, я пишу тест, чтобы убедиться, что я правильно его понял. Возможно, тот факт, что недавно добавленные классы, такие как LocalDateinclude, isBeforeуказывает на то, что Oracle чувствует то же самое. Это не идеал, но я думаю, что в этих обстоятельствах немного удобнее написать вспомогательный isGreaterThanметод.
Марк Слейтер
Работает ли решение @Jon Skeet также, если значение равно 0,00 или 0,0
Анджелина,
1
@ Анджелина: Конечно, я ожидаю, что эти значения не превышают 0, поэтому я ожидаю compareToвернуть 0. Но если вы беспокоитесь, вам будет легко протестировать.
Джон Скит
@MarkSlater Я согласен, если сравнить, то просто Java должна тратить больше времени на улучшение читабельности, и не имеет смысла, если каждый должен создавать свои собственные читаемые методы в каждом проекте. В C # вы также можете создавать методы расширения для существующих классов, чтобы вы могли напрямую использовать `value.isGreaterThen (foo)` `
djmj
165

Возможен лучший способ :

if (value.signum() > 0)
Антон Бессонов
источник
12
BigDecimal.compareTo () начинается со сравнения сигнатур в качестве оптимизации. Так что, вероятно, лучше всего вызывать compareTo (), так как это более показательно для намерения и стоит только стоимость дополнительного вызова метода (который, я подозреваю, в любом случае будет встроен).
Эндрю Спенсер
27
Это часть публичного API. так что для меня это лучший способ. намерение состоит в том, чтобы определить, является ли знак положительным (то есть> ноль)
Марк
Как вы думаете, это более высокая производительность, если он захватывает только первый символ Stringинициализированного, BigDecimalчтобы увидеть, если это -или нет? Это мое лучшее предположение о том, как это может работать. Кажется, быстрее, чтобы действительно определить, если число 0. Это верно? Огромное спасибо заранее Антону Бессонову!
5
Если вы посмотрите на декомпилированный BigDecimal.compareTo()метод, вы обнаружите, что он вызывается signum()дважды. Так что, насколько производительность идет, signum()лучше.
Мое
1
В чем была ваша проблема с десятичными числами? @jfajunior
Исмаил Явуз
11

Используйте compareTo()функцию, встроенную в класс.

duffymo
источник
1

безопаснее использовать метод compareTo()

    BigDecimal a = new BigDecimal(10);
    BigDecimal b = BigDecimal.ZERO;

    System.out.println(" result ==> " + a.compareTo(b));

консольная печать

    result ==> 1

compareTo() возвращается

  • 1, если а больше, чем b
  • -1, если b меньше, чем b
  • 0, если а равно б

Теперь для вашей проблемы вы можете использовать

if (value.compareTo(BigDecimal.ZERO) > 0)

или

if (value.compareTo(new BigDecimal(0)) > 0)

Я надеюсь, что это помогло вам.

Йоши
источник
0

использование ".intValue ()" для объекта BigDecimal не правильно, если вы хотите проверить, является ли его значение больше нуля. Единственный оставленный вариант - метод .compareTo ().

Сатья М
источник
-2
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");
Рама Кришна
источник
Объект obj содержит числовую строку. В принятом ответе значение не объявлено, это может привести к путанице. Мой ответ будет более ясным.
Рама Кришна