자바에서 BigDecimal의 equals와compareTo의 차이에 대해 간단히 말하다
[주: 아래에서 말한 것은 모두 선 jdk 1.4.2 버전을 예로 들면 다른 버전의 실현이 반드시 일치하는 것은 아니므로 무시하십시오.]
우선 BigDecimal의 equals 방법을 살펴보겠습니다.
public boolean equals(Object x){
if (!(x instanceof BigDecimal))
return false;
BigDecimal xDec = (BigDecimal) x;
return scale == xDec.scale && intVal.equals(xDec.intVal);
}
BigDecimal의 euquals 방법은 비교할 데이터 형식을 먼저 판단하고 대상 유형이 일치하는 전제에서 정확도(scale)와 값(BigInteger의 equals 방법)이 일치하는지 여부를 동시에 판단하는 것을 볼 수 있다.사실 javadoc에는 "Compares this BigDecimal with the specified Object for equality. Unlike compareTo,this method considers two BigDecimal objects equal only if they are equal in value and scale(thus 2.0 is not equal to 2.00 when compared by this method)"라고 적혀 있다.단지 자신이 주의하지 않았을 뿐이다!
compareTo 방법:
public int compareTo(BigDecimal val){
/* Optimization: would run fine without the next three lines */
int sigDiff = signum() - val.signum();
if (sigDiff != 0)
return (sigDiff > 0 ? 1 : -1);
/* If signs match, scale and compare intVals */
BigDecimal arg[] = new BigDecimal[2];
arg[0] = this; arg[1] = val;
matchScale(arg);
return arg[0].intVal.compareTo(arg[1].intVal);
}
이 방법에 matchScale의 처리가 있음을 알 수 있다. 정확도가 낮은 대상을 높은 정확도로 전환한 다음에 비교(같은 BigInteger의compareTo 방법)를 한다는 뜻이다. matchScale의 실현은 다음과 같다.
private static void matchScale(BigDecimal[] val) {
if (val[0].scale < val[1].scale)
val[0] = val[0].setScale(val[1].scale);
else if (val[1].scale < val[0].scale)
val[1] = val[1].setScale(val[0].scale);
}
간단한 테스트를 해보겠습니다.
System.out.println(new BigDecimal("1.2").equals(new BigDecimal("1.20"))); // false
System.out.println(new BigDecimal("1.2").compareTo(new BigDecimal("1.20")) == 0); // true
그리고 제 위에 Big Decimal의 구조 방법에 입력된 것은 모두 문자열입니다. 만약에 입력된 것이 숫자 유형이라면 어떤 결과가 나올지 여러분 스스로 테스트하고 원인을 분석할 수 있습니다.
System.out.println(new BigDecimal("1.2").equals(new BigDecimal("1.20"))); // false
System.out.println(new BigDecimal("1.2").compareTo(new BigDecimal("1.20")) == 0); // true
System.out.println(new BigDecimal(1.2).equals(new BigDecimal("1.20"))); // ?
System.out.println(new BigDecimal(1.2).compareTo(new BigDecimal("1.20")) == 0); // ?
System.out.println(new BigDecimal(1.2).equals(new BigDecimal(1.20))); // ?
System.out.println(new BigDecimal(1.2).compareTo(new BigDecimal(1.20)) == 0);// ?
마지막 결론은 Big Decimal의 크기 비교에 대해 equals 방법을 사용하면 값의 크기를 비교할 뿐만 아니라 두 대상의 정확도를 비교할 수 있으며,compareTo 방법은 정확도를 비교하지 않고 수치의 크기만 비교할 수 있다.마지막으로 자신을 경멸하고 이렇게 많은 해 동안 자바 언어를 썼는데 기본적인 상식도 제대로 알지 못했다!
이상의 자바에서 Big Decimal의 equals와compare To의 차이점은 바로 편집자가 여러분에게 공유한 모든 내용입니다. 참고 부탁드리고 저희도 많이 사랑해 주세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
해커랭크 #13 | 부분 문자열 비교 | 🇧🇷A partir desse input , e sabendo que devemos dividir os caracteres de acordo com o número de entrada, usaremos o .compar...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.