2012-01-06 183 views
2

可能重複:
Precision of Floating PointJava的雙精度

 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 2012-01-06 16:36:03

+2

這是浮點類型的預期行爲:http://stackoverflow.com/questions/872544/precision-of-floatingpoint – Piskvor 2012-01-06 16:36:13

回答

7

如果您需要任意精度好,使用java.math.BigDecimal類。

6

這不是問題。這是雙重作品。你不必處理它並關心它。雙精度就足夠了。想想,你的號碼和預期結果之間的差異是在小數點後的19位。

從這個事實得出的唯一結論是絕不會嘗試使用==來比較浮點值 - 結果可能會令人困惑。