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

+2

これは浮動小数点型の予想される動作です:http://stackoverflow.com/questions/872544/precision-of-floating-point – Piskvor

答えて

7

あなたが任意に良い精度が必要な場合は、java.math.BigDecimalクラスを使用します。

6

問題ありません。二重の仕組みです。あなたはそれを扱い、気にする必要はありません。倍精度で十分です。あなたの数字と期待される結果の差は、小数点以下19桁にあると考えてください。

この事実からの唯一の結論は決して==を使用して浮動小数点値を比較しようとすることではありません。結果が混乱する可能性があります。

関連する問題