[java] BigDecimal equals () 대 compareTo ()

간단한 테스트 클래스를 고려하십시오.

import java.math.BigDecimal;

/**
 * @author The Elite Gentleman
 *
 */
public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BigDecimal x = new BigDecimal("1");
        BigDecimal y = new BigDecimal("1.00");
        System.out.println(x.equals(y));
        System.out.println(x.compareTo(y) == 0 ? "true": "false");
    }

}

(의식적으로) 객체 참조 x가 아니라고 말할 수 는 y있지만 프로그램을 실행하면 다음 결과가 표시됩니다.

false
true

질문 : 차이 무엇 compareTo()equals()에서 BigDecimalcompareTo것을 확인할 수 있습니다 x같다가 y?

추신 : BigDecimal에는 inflate()메소드에 대한 equals()메소드가 있습니다. 무엇 않습니다 inflate()실제로합니까?



답변

대답은 메소드 의 JavaDoc에 있습니다equals() .

와 달리 compareTo,이 방법은 두 BigDecimal객체가 값과 스케일이 동일한 경우에만 동일 하다고 간주 합니다 (따라서이 방법과 비교할 때 2.0은 2.00이 아닙니다).

즉 , 모든 측면 에서 객체가 정확히 동일한 지 equals()확인합니다 . “only”는 숫자 값을 비교합니다.BigDecimalcompareTo()

equals() 이런 식으로 행동하는지에 관해서 는, 이것은 이 SO 질문에서 대답되었습니다 .


답변

BigDecimal에는 equals () 메소드에 inflate () 메소드가 있습니다. inflate () 실제로 무엇을합니까?

기본적으로 필요한 경우 inflate()호출 BigInteger.valueOf(intCompact)합니다. 즉, BigIntegerfrom으로 저장된 스케일되지 않은 값을 만듭니다 long intCompact. 필요하지 않고 BigInteger스케일링 되지 않은 값이 long BigDecimal가능한 한 공간을 절약하려고 시도 하는 것 같습니다.


답변

정답은 두 숫자 (BigDecimals)를 만들고 같은 척도를 갖는 것이므로 그 평등에 대해 결정할 수 있다고 생각합니다. 예를 들어이 두 숫자가 같은가요?

1.00001 and 1.00002

음, 그것은 규모에 달려 있습니다. 스케일 5 (소수점 5)에서는 동일하지 않습니다. 그러나 더 작은 10 진수 정밀도 (스케일 4 이하)에서는 동일한 것으로 간주됩니다. 따라서 두 숫자의 스케일을 동일하게 한 다음 비교하십시오.


답변

이중 값과 비교할 수도 있습니다

BigDecimal a= new BigDecimal("1.1"); BigDecimal b =new BigDecimal("1.1");
System.out.println(a.doubleValue()==b.doubleValue());


답변