BigDecimal이 0보다 큰 경우 비교


245

BigDecimal값이 0보다 큰 경우 어떻게 비교할 수 있습니까?


1
github.com/mortezaadi/bigdecimal-utils살펴보면 isPositive () 메소드가 있습니다. is (bigdecimal) .isZero (); is (bigdecimal) .notZero (); is (bigdecimal) .isPositive (); // 0보다 큰 is (bigdecimal) .isNegative (); // 0보다 작은 is (bigdecimal) .isNonPositive (); // 0보다 작거나 같음 is (bigdecimal) .isNonNegative ();
Morteza Adi

@MortezaAdi 는 비교 함수를 BigDecimal구현 Comparable하는 lt, le, eq, ne것이 더 좋습니다 ComparableUtils. 따라서 다른 Date유형이나 사용자 정의 유형 과 같은 다른 클래스에 사용할 수 있습니다 .
djmj 2016 년

@djmj 요구 사항은 구현을 정의하므로 ComparableUtils를 구축 할 필요가 없습니다. lt, le, eq 등의 기능 외에는 일반 기능과 완전히 다릅니다.
Morteza Adi

답변:


401

다음과 같이 간단합니다.

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

에 대한 문서는compareTo 실제로 -1, 0 또는 1을 반환하도록 지정하지만보다 일반적인 Comparable<T>.compareTo방법은 적절한 세 가지 경우 0, 0 또는 0보다 큰 값만 보장하므로 일반적으로 그 비교를 고수합니다.


50
추가 경고 단어가 필요합니다. value값이 0이지만 스케일이 0이 아닌 것으로 가정합니다 (예 : 0.00대신에 평가됨 0). 아마도 0과 같다고 생각하고 싶을 것입니다. compareTo()방법은 참으로이 작업을 수행 할 것입니다. 그러나 equals()방법은 그렇지 않습니다. (필요한 경우 Loki 또는 그의 아바타 중 하나가 살아 있고 소프트웨어 개발로 옮겨 갔다는 또 다른 증거.)
Andrew Spencer

9
이것이 Java의 관용적 솔루션이라는 것에 동의하지만 실제로 읽을 수 있다고 생각하지 않습니다. 이와 같은 표현이 나올 때마다, 나는 그것이 올바른 길을 찾았 음을 확신하는 테스트를 작성합니다. 아마도 LocalDateinclude 와 같이 최근에 클래스를 추가했다는 사실은 isBeforeOracle이 같은 방식으로 느끼고 있음을 나타냅니다. 이상적이지는 않지만 유틸리티 환경을 작성하는 것이 이러한 상황에서 조금 더 읽기 쉽다고 생각합니다 isGreaterThan.
마크 슬레이터

값이 0.00 또는 0.0 인 경우
Angelina

1
@ Angelina : 확실히 그 값 0보다 크지 않기 때문에 0 compareTo을 반환 할 것으로 기대 합니다. 그러나 걱정되는 경우 테스트하기 쉽습니다.
Jon Skeet

@MarkSlater 나는 compareTo가 가독성을 높이기 위해 더 많은 시간을 투자해야하며 모든 사람이 모든 프로젝트에서 자체적으로 읽을 수있는 메소드를 작성 해야하는지 이해하지 못한다는 것에 동의합니다. C #에서는 기존 클래스에 대한 확장 메서드를 만들어`value.isGreaterThen (foo)``를 직접 사용할 수도 있습니다.
djmj

165

더 나은 방법 :

if (value.signum() > 0)

12
BigDecimal.compareTo ()는 signum을 최적화로 비교하여 시작합니다. 따라서 compareTo ()를 호출하는 것이 가장 좋습니다. 더 의도적으로 드러나고 여분의 메소드 호출 가격 (어쨌든 인라인 될 것으로 예상 됨)이 들기 때문입니다.
Andrew Spencer

27
이것은 공개 API의 일부입니다. 나에게 그것은 더 좋은 방법입니다. 부호가 양수인지 확인하려는 의도입니다 (예 :> ZERO)
Marc

당신은 단지의 첫 번째 문자 잡고있는 경우 더 높은 성능이라고 생각하십니까 String초기화 BigDecimal가 어떤지를 확인 -여부를? 그것이 어떻게 작동하는지에 대한 최선의 추측입니다. 실제로 숫자가인지 확인하는 것이 더 빠릅니다 0. 이 올바른지? Anton Bessonov에게 대단히 감사합니다!

5
디 컴파일 된 BigDecimal.compareTo()메소드 를 보면 signum()두 번 호출하는 것을 알 수 있습니다 . 성능 signum()이 좋을수록 좋습니다.
MeIr

1
소수의 경우 문제가 무엇입니까? @jfajunior
İsmail Yavuz

11

compareTo()클래스에 내장 된 함수를 사용하십시오 .


1

방법을 사용하는 것이 더 안전합니다 compareTo()

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

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

콘솔 프린트

    result ==> 1

compareTo() 보고

  • a가 b보다 큰 경우 1
  • b가 b보다 작은 경우 -1
  • a가 b와 같으면 0

이제 당신의 문제에 사용할 수 있습니다

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

또는

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

도움이 되었기를 바랍니다.


0

BigDecimal 오브젝트에서 ".intValue ()"를 사용하는 것이 0보다 강하지 않은지 확인하려는 경우 올바르지 않습니다. 남은 유일한 옵션은 ".compareTo ()"메소드입니다.


-2
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");

obj에 numaric string이 있습니다. 승인 된 답변에서 값이 선언되지 않아 혼동 될 수 있습니다. 내 대답은 더 명확해질 것입니다.
라마 크리슈나
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.