2012-01-06 7 views
2

가능한 중복이 :
Precision of Floating Point자바 배정 밀도

 double a=0.000001,b=50000; 
     b=a*b; 
     System.out.println("double:"+b); // -> double:0.049999999999999996 

     float a=0.000001f,b=50000; 
     b=a*b; 
     System.out.println("float"+b); // -> float0.05 

나는 내 코드의 대부분에서 두 번 사용하고 오늘은이 문제를 발견했다. 어떻게 처리해야합니까?

상황 :

 double []refValues= {100,75,50,25,15,5,1}; 

     double bInMilliGram=b*1000; 
     double pickedVal=0; 
     for(double ref:refValues) 
      if(ref<=bInMilliGram) { 
       pickedVal=ref; 
       break; 
      } 
     System.out.println("bInMilliGram:"+bInMilliGram+", pickedVal:"+pickedVal); 

O/P : -> bInMilliGram : 49.99999999999999, pickedVal : 25.0

+4

http://floating-point-gui.de/ – BalusC

+2

이것은 예상되는 부동 소수점 유형의 동작입니다. http://stackoverflow.com/questions/872544/precision-of-floating-point – Piskvor

답변

7

당신이 임의의 좋은 정밀도를 필요로하는 경우, java.math.BigDecimal 클래스를 사용합니다.

6

문제가되지 않습니다. 그것은 어떻게 두 번 작동합니다. 당신은 그것을 다루고 그것에 대해 신경 쓸 필요가 없습니다. 두 배의 정밀도이면 충분합니다. 숫자와 기대 결과의 차이는 소수점 이하 19 자리에 있다고 생각하십시오.

이 사실의 유일한 결론은 절대로 ==을 사용하여 부동 소수점 값을 비교하려고 시도하는 것입니다. 결과가 혼동을 줄 수 있습니다.

관련 문제