2011-12-02 3 views
1

입니다. Number 매개 변수가있는 메서드가 있고이 값이 int보다 작은 지 확인해야합니다. 내가 생각 해낸 것은 이것이다 :
같은 간단한 작업이 아니라 서투른 보인다
Integer.valueOf(myInt) > (Integer) myNumberint를 숫자와 비교하는 가장 좋은 방법은

. 또한 BigDecimal et.al.을 사용하면 제대로 작동하는지 잘 모르겠습니다. 테스트해야하는 케이스는 무엇입니까?

어떻게 개선 될 수 있습니까?

당신에게

+0

전달 된 숫자는 항상 정수가 될 것입니까? 이 예제에는 캐스트 예외가있을 수 있습니다. – StKiller

+0

나는 그것이 가능하기 때문에 BigInteger에 대해 묻는 것이다. – kostja

+1

이것 좀 봐 : http://stackoverflow.com/questions/480632/why-doesnt-java-lang-number-implement-comparable – CKuck

답변

4

귀하의 코드는 ClassCastException가 발생합니다.

나는이 모든 Number 유형을 올바르게 처리하는 가장 좋은 기회가 말할 것

: double 모든 유형의 넓은 범위를 가지고

myInt > myNumber.doubleValue() 

때문에 당신이 Number로 변환 할 수 있습니다, 그리고 그것을 자르지 것 분수.

+0

가장 빠른 정답입니다. – kostja

+0

btw. int와 비교하기 위해 doubleValue()를 사용하는 이유는 무엇입니까? intValue()는 더 의미가 있습니까? 아니면 몇 가지 단점이 있습니까? – kostja

+0

@kostja : 숫자에 소수 부분이있을 수 있습니다. intValue()는 자르면 비교 결과가 잘못 될 수 있습니다. (아마도 다른 경우는 아니지만 분명히) –

2
myInt > myNumber.intValue() 

감사하지만 그 정보를 삭제할 것입니다. myNumberInteger 아무것도하지만,이 경우

(double)myInt > myNumber.doubleValue() 
+0

캐스트가 필요하지 않습니다. Java는 다른 기본 유형을 비교하는 방법을 알고 있습니다. –

+0

사실,하지만 두 배 사이의 비교임을 분명히하고 싶었습니다 (0.000001 문제). –

4

myNumberLong의 인스턴스 인 경우 여기에서 문제가 발생할 수 있습니다. 오버 플로우 문제가 발생할 수 있습니다 (Number이 실제로 Integer.MAX_VALUE보다 큰 경우 어떻게됩니까?).

Number 또한 일 수 있으며 int으로 변환하면 숫자가 잘릴 수 있으므로 정밀도가 떨어집니다.

double에 전화 번호를 변환하는 것은 합리적인 해결책이 될 수있다 : BigDecimal와의 BigInteger도 수를 확장하기 때문에

myInt > myNumber.doubleValue(); 
2

비교 조금 까다 가져옵니다. 이러한 클래스는 무제한 크기의 정수 값을 포함 할 수 있습니다 (컴퓨터의 메모리로 제한됨).

따라서 BigDecimal 또는 BigInteger가 값을 자르므로 잘못된 값을 구할 수 있습니다.

가장 안전한 방법은 Number를 String으로 변환 한 다음이 String을 BigDecimal 클래스에 제공하여 구문 분석하는 것입니다.

예 :

Number n = ...; 
int i = ...; 

BigDecimal m = new BigDecimal(n.toString()); 
BigDecimal j = new BigDecimal(i); 

boolean result = j.compareTo(m) < 0; 
// equivalent to i < n 

당신은 당신이 BigInteger를 또는 값이 이중의 최대 양 또는 최대 음의 값을 초과하는 다음의 정보는 다음의 제품에 숫자를 얻기 위해 Number.doubleValue을 사용하는 것이 안전합니다 BigDecimal의 인스턴스를 얻을하지 않습니다 확신 경우 비교하다.

BigDecimals를 비교할 필요가있을 수있는 추가 문제가 있습니다. 이는 BigDecimal이 기본 10에서 값을 나타내는 반면 다른 Number 하위 클래스는 기본 2를 사용하기 때문입니다.

이와 같이, new BigDecimal("0.1")0.1d 또는 0.1f과 동일하지 않습니다. 이것은 float와 double이 많은 기본 10 분수를 정확하게 표현할 수 없기 때문입니다 (BigDecimal은 가능). 따라서 BigDecimal에서 double 값을 얻으면 결국 실수로 비교할 수 있습니다. 그러나 당신이 직면 할 필요가없는 문제에서 이것을 ints와 비교하고 있기 때문에.

+0

+1 대단히 큰 BigInteger를 절대 얻지 못할 것입니다. 이 경우,하지만 당신은 아주 좋은 일반적인 포인트를 만들고 있습니다. – kostja

관련 문제