Javaはダブルス権利を比較していないようです
質問
私は、インサートと、リンクリストを作成し、検索した機能を削除します。また、私はそれのためのイテレータを作成しました。さて、私はこれを行うと仮定します:
myList<Integer> test = new myList();
test.insert(30);
test.insert(20);
test.insert(10);
myList.iterator it = test.search(20);
if(it.hasNext())
System.out.println(it.next());
出来上がり、それは(この場合20で、ノードの要素の値を出力)動作します。さて、私はこれを行う場合:
myList<Double> test = new myList();
test.insert(30.1);
test.insert(20.1);
test.insert(10.1);
myList.iterator it = test.search(20.1);
if(it.hasNext())
System.out.println(it.next());
反復子がnullを指しているので、これは、しません。ここでは検索機能の実装があります:
public iterator search(T data)
{
no<T> temp = first;
while( (temp != null) && (temp.data != data) )
temp = temp.next;
return (new iterator(temp));
}
ここで私が比較して怪しい何かがあります知っている方法は次のとおりです。私はこのような上記のコードの一部を変更する場合:
while( (temp != null) && (temp.data != data) )
System.out.println(temp.data + " " + data);
temp = temp.next;
私は、リスト内の数字を印刷し、それを見ることができます。これは、「20.1 20.1」(例えば)ある時点で、印刷します。だから、どのように私はこの問題を解決することができますか?関数は、右のように見えますが、Javaが正しく数値を比較していないかのように、それはちょうどようです。
EDIT:WTH、BigDecimalのは、あまりにも私の問題の同じ種類を与えた。
。EDIT 2:等号()が働いて、他の何かが間違っていた実現しませんでした。申し訳ありません。
解決
あなたはこのために!=演算子を望んでいません。これは、参照をcomapres。あなたは.equals()
方法を望んます:
public iterator search(T data)
{
no<T> temp = first;
while (!data.equals(temp.data)) {
temp = temp.next;
}
return (new iterator(temp));
}
new Float(20.1).equals(new Double(20.1))
falseです。
他のヒント
の を兼ね比較すること.equals()
を使用するとエラーにつながる可能性があります。 Double.equals()
はその平等のテストとしてこれを使用します:
d1.doubleValue() == d2.doubleValue()
のダブルスとメモリに固定された空間に格納された番号ののある近似を浮上。
適切にの浮動小数点数を比較するために、あなたが原因フロートの性質のために、いくつかの誤りがあることを認識する必要があります。
を参照してください。 http://www.google.com/search?q =浮動小数点+ +平等の
ダブルスを比較するために迅速かつ簡単な方法は、Math.abs(a-b)<ACCEPTABLE_ERROR
を使用することです
ACCEPTABLE_ERRORは、あなたがやって正確に何に依存.000000000001
することができどこ。
のの(これは、NaNのとINFINITYとしてエッジケースを処理しません)