2014-05-16 3 views
3

float를 BigDecimal로 변환하려고 시도 중입니다. 그 후 나는 플로트에서 최종 결과를 요구할 것이다.float를 BigDecimal로 변환 한 다음 다시 float으로 변경합니다.

내가 아는 바로는, float을 BigDecimal 숫자로 만드는 유일한 방법은 문자열 생성자를 사용하는 것입니다.

두 가지 접근 방식이 있지만 둘 다 작동하지 않습니다. 안전하게 내가 변환 할 때 정밀도를 잃을 수학을하지 할 수있는 방법이 있나요

Float num1 = 13.846154f; 
BigDecimal calculation = new BigDecimal(Float.toString(num1)); 
BigDecimal num2 = new BigDecimal("2.0").add(calculation); 

Float finalResults = Float.parseFloat(num2.toString()); 

:

Float num1 = 13.846154f; 
BigDecimal calculation = new BigDecimal(Float.toString(num1)); 
BigDecimal num2 = new BigDecimal("2.0").add(calculation); 

Float finalResults = num2.floatValue(); 

접근 방법 # 2 : 모두 나에게 추가 0.000001 값

접근법 # 1을 제공합니다 번호가 다시 떠 다니는가요?

편집 # 1 일부 테스트를 수행하고 이상한 것을 발견했습니다.

플로트 원본 = 13.846154f; 당신이 어떤 정밀도의 손실을 방지하려면

BigDecimal originalNum = new BigDecimal(Float.valueOf(original)); 

BigDecimal numTwo = new BigDecimal("14.0"); 
BigDecimal numThree = new BigDecimal("20.0"); 
BigDecimal numFour = new BigDecimal("30.0"); 

numTwo = numTwo.add(originalNum); 
numThree = numThree.add(originalNum); 
numFour = numFour.add(originalNum); 

그것은 여전히 ​​추가 0.000001 것을 추가하고있다 ..

+0

Float.toString (num1)의 결과를 인쇄하여 BigDecimal 생성자로 가져 오는 항목이 무엇인지 생각해 보았습니까? –

+1

'float' 또는'Float'을'BigDecimal # add'에 넘길 수 없습니다. – rgettman

+0

@rgettman 나는 OP가 sth를 의미한다고 생각한다. 편집을 확인해주세요. – Juvanis

답변

2

, 당신은 BigDecimal를 조금 무의미 될 가능성이 사용 BigDeciml 모든 방법을 사용해야합니다. 내가 double을 사용하는 것이 좋습니다

, 그것은 억 배의 정밀도를 가지고 (정말 그것이 ~ 10^9 *)

이 같은 Float를 사용하지 않는 float를 사용하려는 경우는 어떤 이익을 위해 오버 헤드를 추가 .

13.846154을 수행하는 경우 이미 float보다 정밀도가 높습니다.

System.out.println(13.846155f); 
System.out.println(23.846155f); 
System.out.println(33.846155f); 

인쇄

13.846155 
23.846155 
33.846153 <- a representation error with this many digits. 

대신 당신이

System.out.println(13.846154+ 2.0); 

인쇄 BTW

double finalResult = 13.846154 + 2.0; 

시도 제안

,536,913 float에서 double로의 전환이 그대로 63,210
15.846154 
+0

방법이 있습니까? BigDecimal을 다시 float으로 캐스트 할 수 있습니까? 실제로 float를 사용하는 메서드를 사용하기 때문에 float이 필요합니다. – thhVictor

+1

@thhVictor이 경우에는 'float'을 끝까지 사용하십시오. 'float' 또는'BigDecimal'을 사용하면'float'가 정확하지 않기 때문에 도움이되지 않습니다. 귀하의 질문에 대답하기 위해 BigDecimal.floatValue()를 사용하여 가장 가까운 표현 가능한 값을'float'으로 추출 할 수 있습니다. –

2

new BigDecimal(double) 생성자는, 정확한, 그래서 당신이 floatnum1으로 시작하는 경우, new BigDecimal(num1) 정확한 BigDecimal 상당을 줄 것이다.

아마도 기대하지 않았을 수 있습니다. 예를 들어 가장 가까운 float에서 13.846154까지의 값은 13.84615421295166015625이므로 num1calculation의 초기 값입니다.

BigDecimal 2를 더하면 15가됩니다.84615421295166015625.

다음 문제는 추가 계산을 위해 float으로 바꾸는 것입니다. 결과적으로 정확히 float으로 나타낼 수 있으므로 더 이상 정밀도가 떨어지지 않습니다. 일반적으로 BigDecimalfloat으로 변환하는 경우 가장 가까운 float으로 반올림됩니다.

이 계산에서 정확도가 모두 손실되면 num1 초기화시에 문제가 발생합니다. 이 방법을 사용하면 String과의 모든 변환없이 float의 초기 사용을 통해 가능한 한 가깝게 얻을 수 있습니다. float 만약

은 계산을 위해 충분히 정확하지 않습니다,하지만 당신은, 다른 방법으로 전달하는 마지막 단계를 제외한 모든 계산을 위해 BigDecimal 또는 double 중 하나를 사용하는 것을 고려하는 float이 필요합니다. BigDecimalfloatValue()은 가장 가까운 floatBigDecimal의 정확한 값으로 반환합니다.

String을 사용하는 것이 유리한 경우가 있습니다. BigDecimal을 정확한 십진수로 나타내려면 분수의 문자열 표현에서 BigDecimal을 생성하면 정확하게 구합니다. new BigDecimal(1.0)과 같은 것을 작성하면 값이 0.1000000000000000055511151231257827021181583404541015625 인 BigDecimal이되고, 가장 가까운 값이 0.1로 설정됩니다. float 또는 double으로 이미 변환 한 경우 String을 통해 변환해도 차이가 없거나 정밀도가 떨어집니다. 도움이되지 않습니다.

+0

나는 문자열을 사용하여 BigDecimal 추가 메소드를 사용하여 모든 정밀도 손실을 방지 할 수 있다고 게시물을 읽었습니다. 그러나, 내가 필요한 것은 float 숫자를 입력하고 BigDecimal에서 계산을 한 다음 float을 반환합니다. 네가 그렇게하도록 제안 할 방법이 있을까? – thhVictor

+0

BigDecimal에서 정확하게 수행 할 수없는 계산이 있음에 유의하십시오. 예를 들어 1/3은 정확히 표현할 수 없습니다. 계산이 모두 유한 한 십진수로 정확하게 표현 될 수 있다면 BigDecimal을 사용하고 가장 가까운 float가 필요할 때 floatValue를 가져옵니다. –

+0

그러면 정밀도를 잃지 않고 java에서 수학을 할 수있는 방법이 있습니까? – thhVictor

관련 문제