2012-11-09 3 views
1

저는 에 정말 큰 double 값을 처리 했으므로 다음 전체 숫자로 반올림해야합니다. 이중 값을 반올림하면 항상 최대 값이되는 9.223372036854776E18 값을받습니다. 이 값보다 큰 값을 어떻게 반올림합니까?Java에서 long 유형 최대 값보다 큰 숫자를 반올림하는 방법은 무엇입니까?

편집 : 설명 : Java 프로그래머가 아니며 C 프런트에서 왔습니다. 나는이 사건에 친구를 돕고있다. 내가 서명하지 않은 (분명히 작동하지 않았다), 봤 거든 BigDecimal과 BigInteger를 발견했다. 캐스팅을 시도하고 충돌이 발생했습니다. 그래서 내가 여기 온거야. 도와 주셔서 감사합니다!

답변

5

BigDecimal은 long보다 큰 값을 포함하는 솔루션입니다.

BigDecimal javadoc

당신은 캐스팅하지 BigDecimal(yourDoubleValue);를 인스턴스화 할 필요가 읽어 보시기 바랍니다.

+0

이미 BigDecimal 및 BigInteger에 double 값을 형변환 해 보았습니다. 그러나 매번 추락했습니다. –

+0

예외 메시지와 시도한 코드를 제공해주십시오. – kosa

+3

@Tom : 원시 타입과 참조 타입 사이에 캐스팅 같은 것이 없다. 당신은'BigDecimal.valueOf (doubleValue)'를 수행해야합니다; –

2

BigDecimal은 double 및 float 값을 포함 할 수 있습니다. 을 BigDecimal로 이중 변환하려면 다음과 같은 코드를 사용

double reallyBigDouble 
BigDecimal x = new BigDecimal(reallyBigDouble); 

가장 가까운 정수 값으로 반올림하려면이 같은 코드를 사용할 수 있습니다 본질적으로

BigDecimal roundedToInteger = x.round(new MathContext(MathContext.UNLIMITED)); 
2

:

Math.floor(d+0.5) 

하지만 d이 음수이면 뺄셈에 맞게 조정해야합니다.

+0

이것은 실제로 내 문제에 대한 가장 간단한 해결책입니다. 감사! –

2

double 값이 너무 커서 long에 맞지 않으면 이미 정수 값을 나타내며 반올림해도 아무 효과가 없습니다. double은 유효 부분에 52 비트의 정밀도 만 보유하고 64 비트는 long을 보유하기 때문에 값이 long에 비해 너무 큰 경우 double에는 분수 부분을 보유 할 정밀도가 충분하지 않기 때문입니다.

관련 문제