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.