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


245

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


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
Исмаил Явуз


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 содержит числовую строку. В принятом ответе значение не объявлено, это может привести к путанице. Мой ответ будет более ясным.
Рама Кришна
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.