답변:
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;
}
BigDecimal.ZERO.compareTo(null)
NPE를 던질 것입니다
확인할 수있는 상수가 있습니다.
someBigDecimal.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.00
100 분의 1의 정밀도를 제공하는 반면, 0
정확하지는 않습니다. 상황에 따라를 고수 할 수도 있습니다 .equals()
.
equals
우리가 원하는 것은 아닙니다.
equals
사용해야 하는 상황 이 있습니다 compareTo()
. OP는 그가 사용하는 수학 유형을 지정하지 않으므로 두 가지 옵션을 모두 제공하는 것이 좋습니다.
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
BigDecimal.ZERO.setScale(2).equals(new BigDecimal("0.00"));
BigDecimal.ZERO.equals(selectPrice)
다음 대신이 작업을 수행해야합니다.
selectPrice.equals(BigDecimal.ZERO)
의 경우를 피하기 위해 selectPrice
입니다 null
.