2011-11-10 7 views
25

可能性の重複:
How to resolve a Java Rounding Double issueJavaの2つの倍精度値を比較するには?

、Javaの2つのdouble値の単純な比較は、いくつかの問題を作成します。 Javaの次の単純なコードスニペットを考えてみましょう。

package doublecomparision; 

final public class DoubleComparision 
{ 
    public static void main(String[] args) 
    { 
     double a = 1.000001; 
     double b = 0.000001; 

     System.out.println("\n"+((a-b)==1.0)); 
    } 
} 

上記のコードは、trueを返すように見える表現((a-b)==1.0)の評価が、それはしません。この式の評価が1.0と等しくないため、実際にはであると予想された0.9999999999999999であるため、falseが返されます。したがって、条件はboolean falseと評価されます。このような状況を克服するための最善の提案方法は何ですか?

+6

これは、倍数と浮動小数点はすべての数値を表すことができないためです。彼らは実際に近似値を使って値を表しています。 – onit

答えて

53

を見てみましょう。基本的あなたはこのような何か行う必要があり、正確な比較を行うべきではありません:あなたはDouble.compareを使用することができます

double a = 1.000001; 
double b = 0.000001; 
double c = a-b; 
if (Math.abs(c-1.0) <= 0.000001) {...} 
+7

Doubleの比較メソッドを見てみるとよいでしょう。 http://www.tutorialspoint.com/java/lang/double_compare.htm –

+12

Double.compareを使用する場合は、 に注意してください(1)d1とd2の両方がDouble.NaNを表す場合は、メソッドDouble.NaN == Double.NaNの値がfalseであってもtrueを返します。 (2)d1が+0.0を表し、d2が-0.0を表す、またはその逆の場合、このメソッドは+0.0 == - 0.0の値がtrueであってもfalseを返します。 この定義では、ハッシュテーブルを正しく動作させることができます。 – shiggity

8

小数のarithemeticにdoubleを使用する代わりに、java.math.BigDecimalを使用してください。期待される結果が得られます。参考のため

このstackoverflow question

+14

BigDecimalは実行可能な解決策ではない場合があります。 – mcfinnigan

1

を。 2つの指定されたdouble値を比較します。

関連する問題