Java에서 BigDecimal 변수 == 0인지 확인하는 방법은 무엇입니까?


202

Java로 다음 코드가 있습니다.

BigDecimal price; // assigned elsewhere

if (price.compareTo(new BigDecimal("0.00")) == 0) {
    return true;
}

if 조건을 작성하는 가장 좋은 방법은 무엇입니까?


12
BigDecimal의 .equals () 메소드 사용을 제안하는 많은 답변이 있습니다. 그러나이 메소드는 스케일을 고려하므로 compareTo ()를 사용하는 것과 동일하지 않습니다.
— GriffeyDog 2016 년

답변:


472

compareTo(BigDecimal.ZERO)대신에 사용하십시오 equals():

if (price.compareTo(BigDecimal.ZERO) == 0) // see below

BigDecimal상수 와 비교하면 모든 실행 BigDecimal.ZERO을 구성하지 않아도됩니다 new BigDecimal(0).

참고로, BigDecimal또한 상수를 BigDecimal.ONE하고 BigDecimal.TEN사용자의 편의를 위해.


노트!

사용할 수없는 이유 BigDecimal#equals()는 규모 를 고려하기 때문입니다.

new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!

순수한 숫자 비교에는 적합하지 않습니다. 그러나 BigDecimal.compareTo()비교할 때 규모를 고려하지 마십시오.

new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true

BigDecimal.ZERO.compareTo (price) == 0
— Jackkobec

97

또는 signum ()을 사용할 수 있습니다.

if (price.signum() == 0) {
    return true;
}

21
아마 더 빠를 지 모르지만 compareTo (BigDecimal.ZERO)가 더 읽기 쉽습니다.
— ElYeante

@ElYeante, 당신은 항상 더 읽기 쉬운 이름을 가진 방법으로, 또는 이러한 비교와 연결하여 비즈니스 논리의 일부를 설명하는 방법으로 이것을 포장 할 수 있습니다
— WeGa

3
unsignuntely signum ()은 null 안전하지 않지만, compareTo는 BigDecimal.ZERO.compareTo ()와 같이 비교할 때주의해야합니다.
— WeGa

15
@WeGa 사실이 아닙니다 : BigDecimal.ZERO.compareTo(null)NPE를 던질 것입니다
— ACV

5
@ACV 감사합니다. 소스 코드를 보면 compareTo ()는 null이 아닌 인수 만 기대합니다.
— WeGa


5

나는 보통 다음을 사용합니다.

if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }

5

또는 BigDecimal 클래스의 equals 및 compareTo 메소드의 동작이 서로 일치하지 않는다고 언급 할 가치가 있다고 생각합니다 .

이것은 기본적으로 다음을 의미합니다.

BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO)==0); //true
System.out.println(someValue.equals(BigDecimal.ZERO)); //false

따라서 someValue변수 의 척도에 매우주의해야 합니다. 그렇지 않으면 예기치 않은 결과가 발생합니다.


5

equals ()는 객체이므로 내장 ZERO 인스턴스를 활용하고 싶습니다.

if(selectPrice.equals(BigDecimal.ZERO))

참고 .equals()selectPrice이 같은 규모 (0) 그래서하지 않는 계정으로 규모를합니다 .ZERO다음이 false를 반환합니다가.

방정식을 원래대로 축소

if(selectPrice.compareTo(BigDecimal.ZERO) == 0)

어떤 수학적 상황에서는 스케일을 고려 0.00 != 0한다고 생각 .equals()합니다. 0.00100 분의 1의 정밀도를 제공하는 반면, 0정확하지는 않습니다. 상황에 따라를 고수 할 수도 있습니다 .equals().


Java BigDecimal의 동작은 생각 equals과 다릅니다 compareTo. docs.oracle.com/javase/1.5.0/docs/api/java/math/…
— nhahtdh

문서에 연결하는 대신 의미가 무엇인지 설명해 주시겠습니까? 내가 제안한 것은 OP를 위해 작동해야합니다.
— NominSim

Edwin Dalorzo의 답변은 실제로 그것을 잘 설명합니다. equals우리가 원하는 것은 아닙니다.
— nhahtdh

@nhahtdh 정보 대신 감사합니다. 실제로 대신에 equals 사용해야 하는 상황 이 있습니다 compareTo(). OP는 그가 사용하는 수학 유형을 지정하지 않으므로 두 가지 옵션을 모두 제공하는 것이 좋습니다.
— NominSim

3

GriffeyDog는 확실히 맞습니다 :

암호:

BigDecimal myBigDecimal = new BigDecimal("00000000.000000");
System.out.println("bestPriceBigDecimal=" + myBigDecimal);
System.out.println("BigDecimal.valueOf(0.000000)=" + BigDecimal.valueOf(0.000000));
System.out.println(" equals=" + myBigDecimal.equals(BigDecimal.ZERO));
System.out.println("compare=" + (0 == myBigDecimal.compareTo(BigDecimal.ZERO)));

결과 :

myBigDecimal=0.000000
BigDecimal.valueOf(0.000000)=0.0
 equals=false
compare=true

BigDecimal 비교의 이점을 이해하지만 ==, <,>, <=,> = 연산자와 같은 직관적 인 구성으로 간주하지는 않습니다. 머리에 백만 가지 물건 (7, 7 가지)을 들고있을 때는인지 부하를 줄일 수있는 것이 좋습니다. 그래서 유용한 편의 기능을 만들었습니다.

public static boolean equalsZero(BigDecimal x) {
    return (0 == x.compareTo(BigDecimal.ZERO));
}
public static boolean equals(BigDecimal x, BigDecimal y) {
    return (0 == x.compareTo(y));
}
public static boolean lessThan(BigDecimal x, BigDecimal y) {
    return (-1 == x.compareTo(y));
}
public static boolean lessThanOrEquals(BigDecimal x, BigDecimal y) {
    return (x.compareTo(y) <= 0);
}
public static boolean greaterThan(BigDecimal x, BigDecimal y) {
    return (1 == x.compareTo(y));
}
public static boolean greaterThanOrEquals(BigDecimal x, BigDecimal y) {
    return (x.compareTo(y) >= 0);
}

사용 방법은 다음과 같습니다.

    System.out.println("Starting main Utils");
    BigDecimal bigDecimal0 = new BigDecimal(00000.00);
    BigDecimal bigDecimal2 = new BigDecimal(2);
    BigDecimal bigDecimal4 = new BigDecimal(4);  
    BigDecimal bigDecimal20 = new BigDecimal(2.000);
    System.out.println("Positive cases:");
    System.out.println("bigDecimal0=" + bigDecimal0 + " == zero is " + Utils.equalsZero(bigDecimal0));
    System.out.println("bigDecimal2=" + bigDecimal2 + " <  bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThan(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
    System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal20=" + bigDecimal20 + " is " + Utils.equals(bigDecimal2, bigDecimal20));
    System.out.println("bigDecimal2=" + bigDecimal2 + " <= bigDecimal4=" + bigDecimal4 + " is " + Utils.lessThanOrEquals(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal4=" + bigDecimal4 + " >  bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThan(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal4=" + bigDecimal4 + " >= bigDecimal2=" + bigDecimal2 + " is " + Utils.greaterThanOrEquals(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal20=" + bigDecimal20 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal20));
    System.out.println("Negative cases:");
    System.out.println("bigDecimal2=" + bigDecimal2 + " == zero is " + Utils.equalsZero(bigDecimal2));
    System.out.println("bigDecimal2=" + bigDecimal2 + " == bigDecimal4=" + bigDecimal4 + " is " + Utils.equals(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal4=" + bigDecimal4 + " <  bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThan(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal4=" + bigDecimal4 + " <= bigDecimal2=" + bigDecimal2 + " is " + Utils.lessThanOrEquals(bigDecimal4, bigDecimal2));
    System.out.println("bigDecimal2=" + bigDecimal2 + " >  bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThan(bigDecimal2, bigDecimal4));
    System.out.println("bigDecimal2=" + bigDecimal2 + " >= bigDecimal4=" + bigDecimal4 + " is " + Utils.greaterThanOrEquals(bigDecimal2, bigDecimal4));

결과는 다음과 같습니다.

Positive cases:
bigDecimal0=0 == zero is true
bigDecimal2=2 <  bigDecimal4=4 is true
bigDecimal2=2 == bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal20=2 is true
bigDecimal2=2 <= bigDecimal4=4 is true
bigDecimal4=4 >  bigDecimal2=2 is true
bigDecimal4=4 >= bigDecimal2=2 is true
bigDecimal2=2 >= bigDecimal20=2 is true
Negative cases:
bigDecimal2=2 == zero is false
bigDecimal2=2 == bigDecimal4=4 is false
bigDecimal4=4 <  bigDecimal2=2 is false
bigDecimal4=4 <= bigDecimal2=2 is false
bigDecimal2=2 >  bigDecimal4=4 is false
bigDecimal2=2 >= bigDecimal4=4 is false

1
정확히 설명하는 여러 답변이 있습니다. 다른 답변을 추가하는 요점은 무엇입니까? 추가 정보가 있으면 새 답변을 추가하는 것이 좋습니다. 그러나이 게시물에는 해당되지 않습니다.
— Tom

요점을 알았어. 그러나 무언가를 배우고있을 때, 비슷한 경우에도 가능한 많은 예제를보고 싶습니다. 당신을 위해, Tom, 나는 내가 유용하다고 생각한 라이브러리를 추가했습니다. 마일리지가 다를 수 있습니다. :-)
— Tihamer

0

여기에 kotlin에 대한 유용한 확장 기능을 공유하고 싶습니다

fun BigDecimal.isZero() = compareTo(BigDecimal.ZERO) == 0
fun BigDecimal.isOne() = compareTo(BigDecimal.ONE) == 0
fun BigDecimal.isTen() = compareTo(BigDecimal.TEN) == 0

-2
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));

1
이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법 및 / 또는 이유 에 대한 추가 컨텍스트 를 제공 하면 답변의 장기적인 가치가 향상됩니다. 지금 질문하는 사람뿐만 아니라 앞으로 독자들에게 질문에 대답하고 있음을 기억하십시오! 제발 편집 설명을 추가하고, 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을. 이 답변이 왜 다른 사람들보다 더 적합한 지 언급하는 것도 아프지 않습니다.
— Dev-iL

-8

0 을 나타내는 정적 상수가 있습니다 .

BigDecimal.ZERO.equals(selectPrice)

다음 대신이 작업을 수행해야합니다.

selectPrice.equals(BigDecimal.ZERO)

의 경우를 피하기 위해 selectPrice입니다 null.


3
Java BigDecimal의 동작은 생각 equals과 다릅니다 compareTo. docs.oracle.com/javase/1.5.0/docs/api/java/math/…
— nhahtdh

그래서 두 번째 줄에 대해 ... selectedPrice가 null이면 NullPointerException이 발생합니다.
— user3206236
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.