BigDecimal에서>, =, <와 같은 비교 연산자를 사용하는 방법


103

unitPrice가 BigDecimal 데이터 유형으로 설정된 도메인 클래스가 있습니다. 이제 가격을 비교하는 방법을 만들려고하는데 BigDecimal 데이터 유형에 비교 연산자를 사용할 수없는 것 같습니다. 데이터 유형을 변경해야합니까? 아니면 다른 방법이 있습니까?


이후는 BigDecimal입니다 Object, 아니이 나던 작동합니다. 그러나 단순히 서로 하나를 빼고 결과 값이 <0, ==0또는인지 확인할 수 >0있습니다. 그렇지 않으면에서 제공 방법과 표준 길을 갈 수 의 BigDecimal
SomeJavaGuy

2
그래서 compareTo-1, 0 또는 1을 반환 하는 메서드가 Comparable있습니다. 기본적으로 .
M. Deinum

답변:


113

Class의 모든 객체에는 다른 BigDecimal과 비교하는 데 사용할 수 BigDecimal있는 메소드가 compareTo있습니다. 의 결과는 compareTo다음 비교한다 > 0, == 0또는 < 0당신이 필요에 따라 달라집니다. 문서를 읽으면 알게 될 것입니다.

연산자는 ==, <, >등이 단지와 같은 기본 데이터 유형을 사용할 수 있습니다 int, long, double자신의 래퍼 같은 클래스 나 Integer하고 Double.

의 문서에서 compareTo:

이것을 지정된와 비교 BigDecimal합니다 BigDecimal.

BigDecimal 값이 같지만 배율이 다른 두 개체 (예 : 2.0 및 2.00)는이 방법으로 동일한 것으로 간주됩니다. 이 메서드는 6 개의 부울 비교 연산자 (<, ==,>,> =,! =, <=) 각각에 대해 개별 메서드보다 우선적으로 제공됩니다. 이러한 비교를 수행하기 위해 제안 된 관용구는 다음과 같습니다. (x.compareTo(y) <op> 0), 여기서는 <op> 6 개의 비교 연산자 중 하나입니다.

이 BigDecimal이 숫자 적으로 val보다 작거나 같거나 큰 경우 -1, 0 또는 1을 반환합니다.


1
그러나 compareTo 메서드는 가격이 더 큰지, 같은지 또는 더 낮은지를 찾는 데 도움이됩니까?
user3127109

2
예. 해당 정보는 답변에 제공된 링크에 있습니다.
Drew Kennedy

4
@ user3127109 예, a.compareTo(b)제로의 경우보다 숫자 큰 반환 a > b, 0경우 a == b, 및 제로보다 작은 경우를 a < b.
Zoltán

119

짧게 말하면 :

firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"    
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="  
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="    

22

compareToBigDecimal 메소드를 사용하십시오 .

public int compareTo (BigDecimal val)이 BigDecimal을 지정된 BigDecimal과 비교합니다.

Returns:
-1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.

12

compareTo, 라는 메서드를 사용할 수 있습니다 x.compareTo(y). x와 y가 같으면 0을, x가 y보다 크면 1을, x가 y보다 작 으면 -1을 반환합니다.


11

다음은 6 개의 모든 부울 비교 연산자 (<, ==,>,> =,! =, <=)의 예입니다.

BigDecimal big10 = new BigDecimal(10);
BigDecimal big20 = new BigDecimal(20);

System.out.println(big10.compareTo(big20) < -1);  // false
System.out.println(big10.compareTo(big20) <= -1); // true
System.out.println(big10.compareTo(big20) == -1); // true
System.out.println(big10.compareTo(big20) >= -1); // true
System.out.println(big10.compareTo(big20) > -1);  // false
System.out.println(big10.compareTo(big20) != -1); // false

System.out.println(big10.compareTo(big20) < 0);   // true
System.out.println(big10.compareTo(big20) <= 0);  // true
System.out.println(big10.compareTo(big20) == 0);  // false
System.out.println(big10.compareTo(big20) >= 0);  // false
System.out.println(big10.compareTo(big20) > 0);   // false
System.out.println(big10.compareTo(big20) != 0);  // true

System.out.println(big10.compareTo(big20) < 1);   // true
System.out.println(big10.compareTo(big20) <= 1);  // true
System.out.println(big10.compareTo(big20) == 1);  // false
System.out.println(big10.compareTo(big20) >= 1);  // false
System.out.println(big10.compareTo(big20) > 1);   // false
System.out.println(big10.compareTo(big20) != 1);  // true

5

BigDecimal은 기본 형식이 아니므로 <, >연산자를 사용할 수 없습니다 . 그러나이므로 동일한 효과를 Comparable사용할 수 있습니다 compareTo(BigDecimal). 예 :

public class Domain {
    private BigDecimal unitPrice;

    public boolean isCheaperThan(BigDecimal other) {
        return unitPirce.compareTo(other.unitPrice) < 0;
    }

    // etc...
}

0

IBM의 com.ibm.etools.marshall.util.BigDecimalRange util 클래스를 사용 하면 BigDecimal 이 범위 내에 있는지 비교할 수 있습니다 .

boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);

0

이 스레드에는 BigDecimal.compareTo (BigDecimal) 메서드가 BigDecimal 인스턴스 를 비교하는 데 사용할 수 있다는 많은 답변 이 있습니다 . BigDecimal.compareTo (BigDecimal) 메서드를 사용하여 더 이상 경험하지 않은 경우 BigDecimal 인스턴스를 만드는 방법에주의 하기 위해 추가하고 싶었습니다 . 예를 들어 ...

  • new BigDecimal(0.8)정확 하지 않고 스케일이 50+ 인 BigDecimal값 으로 인스턴스를 생성합니다 .0.8
  • new BigDecimal("0.8")크리에이트 것이다 BigDecimal값으로 인스턴스 이고 정확히 0.81의 배율을 가지고

... 그리고 BigDecimal.compareTo (BigDecimal) 메서드 에 따르면 두 값은 소수 자릿수로 제한되지 않을 때 값이 같지 않기 때문에 같지 않은 것으로 간주됩니다 .

우선 BigDecimal, BigDecimal(String val)생성자가 BigDecimal.valueOf(double val)아닌 생성 자나 메서드 를 사용하여 인스턴스 를 만들 때주의하십시오 BigDecimal(double val). 둘째, BigDecimal.setScale (int newScale, RoundingMode roundingMode) 메서드 를 사용하여 비교하기 전에 BigDecimal 인스턴스 의 크기를 제한 할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.