2013-04-07 2 views
0

그래서 BigDecimal은 1/3에 대한 답처럼 무한대로 계속되는 숫자를 저장하는 것처럼 보이지 않습니다. 나는 것을 시도했을 때, 나는 다음과 같은 얻을 : BigDecimal Rounding

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 

그래서 내가 RoundingMode를 사용하기로 결정했다. 내가 (1/3)*3을 할 때, 나는 그것이 1로 되돌아 가기를 원하고, 0.9, 0.99, 0.999 또는 그와 같은 어떤 형태도 원하지 않습니다. 당신이 1 개 소수점 장소를 반올림 필요 같은 내가 (1/3) * 2을 할 수 있다면 그러나, 나는 그것이 1.

답변

0

까지 반올림하지 않으려는 것은 같은데,이 시도 :

BigDecimal base = new BigDecimal("1.0"); 
BigDecimal result = base.divide(new BigDecimal("3"), 1, RoundingMode.HALF_UP); 

및 도큐멘트 읽기 here

+0

내가 한 일입니다. 결과를 3 배로 늘리려면 어떻게해야하는지 알아 내려고 노력 중입니다. – dalawh

+1

불가능합니다. 수학을 할 때 정확한 결과 (반올림없이) 또는 둥근 결과 (정밀도가 떨어짐)가 필요한지 결정해야합니다. – 1ac0

0

번호를 반올림하면 정보가 손실됩니다. BigDecimal을 사용하면 최종 결과를 다시 반올림하지 않는 한 (1/3) * 3으로 절대 1을 얻지 못합니다.

+0

BigDecimal 대신 (1/3) * 3을 할 때 1을 얻을 수 있고 (1/3) * 2 일 때 0.6667을 얻을 수있는 대안이 있습니까? – dalawh

+0

가장 좋은 대안은 Medo42의 대답입니다. – WilQu

1

약수가 항상 3 인 경우 정확한 결과를 얻기 위해 정수를 3으로 확장 한 수학을 할 수 있습니다. 예 : 2를 사용하여 2/3을 표현하고 1/3을 1로 사용하십시오. Best way to represent a fraction in Java?

: 그들을 3/3 = 1

만 분수로 표현 할 수있는 숫자와 함께 작동 여전히 다양한 제수하지만 필요한 경우를 의미하는 당신에게 3를 얻을 것이다 추가하면, 당신은이 질문을보고 할 수 있습니다

비합법적 인 숫자 (예 : Pi 또는 sqrt (2))를 정확하게 나타내야하고 계산해야하는 경우 운이 좋지 않을 것입니다. 여기를 참조하십시오 : Irrational number representation in any programming language?