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

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

BigDecimal price; // assigned elsewhere

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

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



답변

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


답변

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

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


답변

확인할 수있는 상수가 있습니다.

someBigDecimal.compareTo(BigDecimal.ZERO) == 0


답변

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

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


답변

또는 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변수 의 척도에 매우주의해야 합니다. 그렇지 않으면 예기치 않은 결과가 발생합니다.


답변

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().


답변

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