2014-04-12 3 views
0

나는 수학 연산을 베팅하고 있지만 float (자바 가상 머신의 근사값은 완벽하지 않다)에 문제가있다. 그래서,이 BigDecimal의에서이 작업을 전환하기로 결정 ...하지만 결과 몇 가지 문제 ..float에서 Java의 BigDecimal까지의 연산

이 원래 코드했습니다 : 이것은 내 convertion입니다

public float ConvertTo100(float input) 
    { 
float output = 0.0f; 
     int hh; 
     float mm; 
     hh = (int)input; 
     mm = input - hh; 

     output = hh + ((input - hh)/60) * 100; 

     return output; 
} 

,하지만 작동하지 않습니다 :

public float ConvertTo100(float input) 
     { 
      BigDecimal inputBD = new BigDecimal(Float.toString(input)); 

      String inpString = String.valueOf(input); 
      String[] inpsplit = inpString.split("\\."); 

      BigDecimal hh = new BigDecimal(Float.toString(Integer.parseInt(inpsplit[0]))); 

      BigDecimal output = hh.add((inputBD.subtract(hh).divide(BigDecimal.valueOf(60))).multiply(BigDecimal.valueOf(1000))); 

      return Float.parseFloat(String.valueOf(output)); 
} 

어디에서 문제가 있습니까 ?? 정말 고맙습니다!!! :)

+0

'String'에 대해 무의미한 변환을하는 것처럼 보입니다. BigDecimal (double) 생성자의 사용을 피하는 유일한 이유는'double'으로 반올림하는 것을 피하기 위해서입니다. 당신은 이미'float'을 가지고 있습니다. 그리고 모든'float' 값들은 반올림없이'double'에서 정확하게 나타낼 수 있습니다. –

답변

0

많은 입력에 대해 60 나누기를 정확히 십진수로 입력 할 수 없습니다. BigDecimal을 계속 사용하려면 해당 부서의 배율 및 반올림 모드를 선택해야합니다. 이를 수행하는 한 가지 방법이 있지만 모든 옵션을 보려면 BigDecimal documentation을 읽으십시오.

BigDecimal output = hh.add((inputBD.subtract(hh).divide(
    BigDecimal.valueOf(60), 10, BigDecimal.ROUND_HALF_EVEN)) 
    .multiply(BigDecimal.valueOf(1000))); 

그러나 BigDecimal를 사용하는 중요한 점은 소수 분수의 정확한 표현을 얻을 수 있습니다. 당신은 그 이익을 얻지 못하고 있지만, 삽입 연산자 대신에 메소드 호출을 사용하여 산술 연산을하는 결과 인 지저분한 코드를 얻고 있습니다. 특정 반올림 모드 또는 16.9 자릿수보다 큰 유한 정밀도가 필요한 경우가 아니면 double을 사용하는 것이 훨씬 나을 것입니다.

+0

예! :) 정말 고마워! 그것은 나를 위해 대단한 작품! :) – user3449772