지난 이틀 동안 지불 금액 확인을 처리 할 때 문제가있었습니다. Bigdecimal의 평등 방법을 사용하여 두 금액이 동일인지 비교하여 양 비교에서 오류가 발생했습니다 (예 : 3.0과 3.00의 비교 등).
[참고 : 다음은 Sun 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 방법은 먼저 비교할 데이터 유형을 결정하는 것임을 알 수 있습니다. 객체 유형이 일관된 경우 정확도 (스케일) 및 값 (BigInteger의 평등 메소드)이 일관되는지 동시에 결정됩니다.
실제로 Javadoc에서는 이미 매우 명확합니다. "이 큰 값을 평등에 대한 지정된 객체와 비교합니다. 비교와는 달리,이 방법은 값과 척도가 동일 한 경우에만 두 개의 큰 객체를 동일하게 간주합니다 (따라서 2.0 은이 방법에 의해 비교할 때 2.0이 아닙니다)." 나는 단지주의를 기울이지 않았다!
비교 방법을 살펴 보겠습니다.
public int compareto (bigdecimal val) {/ * 최적화 : 다음 세 줄 없이도 잘 실행됩니다 */int sigdiff = signum () - val.signum (); if (sigdiff! = 0) return (sigdiff> 0? 1 : -1);/ * 부호가 일치하는 경우 intvals */bigdecimal [] = arg [2]; val; matchScale (arg); return arg [0] .intval.compareto (arg [1] .intval); } 이 방법에는 매치 스케일 처리가 있음을 알 수 있습니다. 즉, 정확도가 낮은 객체를 정확도로 변환 한 다음 비교 (BigInteger의 비교 방법)를 비교하는 것을 의미합니다. 매치 스케일의 구현은 다음과 같습니다.
개인 정적 void matchscale (bigdecimal [] val) {if (val [0] .Scale <val [1] .Scale) val [0] = val [0] .SetSscale (val [1] .Scale); else if (val [1] .Scale) val [1] = val [1] .SetScale (Val [0] .Scale); } 간단한 테스트 수행 :
System.out.println (New Bigdecimal ( "1.2"). Equals (New Bigdecimal ( "1.20")); // output falsesystem.out.println (new bigdecimal ( "1.2"). 비교 (new bigdecimal ( "1.20") == 0); // true를 출력합니다
또한 위의 Bigdecimal 생성자가 문자열로 전달된다는 것을 알았습니다. 전달 된 숫자 유형이 발생하면 어떻게됩니까? 직접 테스트하고 이유를 분석 할 수 있습니다.
System.out.println (New Bigdecimal ( "1.2"). Equals (New Bigdecimal ( "1.20")); // output falsesystem.out.println (new bigdecimal ( "1.2"). 비교 (new bigdecimal ( "1.20") == 0); // output true system.out.println (new bigdecimal (1.2) .equals (new bigdecimal ( "1.20")); // output는 it 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); // 출력입니까?
마지막 결론은 다음과 같습니다. Bigdecimal의 크기 비교의 경우, Equals 메소드를 사용하면 값의 크기를 비교할뿐만 아니라 두 객체의 정확도를 비교합니다. 비교 방법은 정확도를 비교하지 않지만 값의 크기 만 비교합니다.
마침내, 나는 나 자신을 멸시한다. 나는 수년간 Java 언어를 사용해 왔으며 기본적인 상식조차 찾지 못했습니다!
위의 기사는 Bigdecimal의 평등과 Java의 비교의 차이점에 대해 간단히 이야기합니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.