간단한 테스트 클래스를 고려하십시오.
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()
에서 BigDecimal
그 compareTo
것을 확인할 수 있습니다 x
같다가 y
?
추신 : BigDecimal에는 inflate()
메소드에 대한 equals()
메소드가 있습니다. 무엇 않습니다 inflate()
실제로합니까?
답변
대답은 메소드 의 JavaDoc에 있습니다equals()
.
와 달리
compareTo
,이 방법은 두BigDecimal
객체가 값과 스케일이 동일한 경우에만 동일 하다고 간주 합니다 (따라서이 방법과 비교할 때 2.0은 2.00이 아닙니다).
즉 , 모든 측면 에서 객체가 정확히 동일한 지 equals()
확인합니다 . “only”는 숫자 값을 비교합니다.BigDecimal
compareTo()
왜 equals()
이런 식으로 행동하는지에 관해서 는, 이것은 이 SO 질문에서 대답되었습니다 .
답변
BigDecimal에는 equals () 메소드에 inflate () 메소드가 있습니다. inflate () 실제로 무엇을합니까?
기본적으로 필요한 경우 inflate()
호출 BigInteger.valueOf(intCompact)
합니다. 즉, BigInteger
from으로 저장된 스케일되지 않은 값을 만듭니다 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());