자바에서 BigDecimal의 equals와compareTo의 차이에 대해 간단히 말하다

3095 단어 comparetoequalsjava
요 며칠 동안 결제 금액 검사를 처리할 때 문제가 생겼습니다. 어떤 금액은 제가 Big Decimal의 equals 방법으로 두 금액이 같은지 비교한 결과 금액 비교에 오류가 발생했습니다(예를 들어 3.0과 3.00의 비교 등).
[주: 아래에서 말한 것은 모두 선 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의 차이점은 바로 편집자가 여러분에게 공유한 모든 내용입니다. 참고 부탁드리고 저희도 많이 사랑해 주세요.

좋은 웹페이지 즐겨찾기