Порівняйте, якщо BigDecimal більше нуля


245

Як я можу порівняти, якщо BigDecimalзначення більше нуля?


1
загляньте в github.com/mortezaadi/bigdecimal-utils є метод isPositive () також є як є (bigdecimal) .isZero (); є (bigdecimal) .notZero (); є (bigdecimal) .isPositive (); // більший за нуль є (bigdecimal) .isNegative (); // менше нуля є (bigdecimal) .isNonPositive (); // менше або рівний нулю - (великийдециф) - .isNonNegative ();
Morteza Adi

@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, я не думаю, що це насправді читабельно. Кожного разу, коли я стикаюся з таким виразом, я виявляю, що я пишу тест, щоб запевнити себе, що я зрозумів це правильно. Можливо, той факт, що нещодавно додані класи, як, зокрема, LocalDateвключають, isBeforeє свідченням того, що Oracle відчуває так само. Це не ідеально, але я думаю, що в цих умовах трохи зручніше читати, щоб написати корисний isGreaterThanметод.
Марк Слейтер

Чи працює також рішення @Jon Skeet, якщо значення 0,00 або 0,0
Анджеліна

1
@Angelina: Я, безумовно, очікувала, що ці значення не перевищують 0, тому я б очікував compareToповернути 0. Але якщо ви хвилюєтесь, вам слід легко перевірити.
Джон Скіт

@MarkSlater Я погоджуюся, CompareTo - це просто Java, яка повинна вкладати більше часу для покращення читабельності, і немає сенсу, якщо кожен повинен створити свої власні читабельні методи у кожному проекті. У C # ви також можете створити методи розширення для існуючих класів, щоб ви могли безпосередньо використовувати `value.isGreaterThen (foo)` `
djmj

165

Можливий кращий спосіб :

if (value.signum() > 0)

12
BigDecimal.compareTo () починається з порівняння знаків як оптимізації. Тож, мабуть, найкраще зателефонувати на сравнениеTo (), оскільки це більше виявляє наміри і коштує лише ціну додаткового виклику методу (який я підозрюю, що все-таки отримає вказівку).
Ендрю Спенсер

27
Це частина загальнодоступного API. тож для мене це кращий спосіб. намір визначити, чи є знак позитивним (тобто> ZERO)
Марк

Ви вважаєте, що це більш висока продуктивність, якщо вона лише захоплює перший символ Stringініціалізованого, BigDecimalщоб побачити, -чи ні? Це моя найкраща здогадка про те, як це могло працювати. Здається, швидше насправді визначити, чи є число 0. Це правильно? Заздалегідь дякую Антону Бессонову!

5
Якщо ви подивитесь на декомпільований BigDecimal.compareTo()метод, ви побачите, що він дзвонить signum()двічі. Тож, наскільки ефективніше, signum()тим краще.
Меїр

1
Яка у вас проблема з десятковими відмінками? @jfajunior
Ізмаїл Явуз

11

Використовуйте compareTo()вбудовану в клас функцію.


1

безпечніше використовувати метод compareTo()

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

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

консольний друк

    result ==> 1

compareTo() повертає

  • 1, якщо a більше b
  • -1, якщо b менше b
  • 0, якщо a дорівнює b

тепер для вашої проблеми ви можете використовувати

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.