2017-02-01 10 views
0

Double/Floatでは、小数点から2進表記に変換する際に丸め誤差や精度の低下があります。 たとえば、floatを "6.1"に設定してからもう一度印刷すると、 "6.099999904632568359375"のような報告された値が得られます。 2つのダブルオブジェクトの等価性をチェックするためのより良いオプションです : BigDecimalの または (Math.abs(ダブルサイズ - ダブルサイズ)<イプシロン)を使用するには、Javaの2倍の間の等価性を確認するにはどうすればよいですか

+2

あなたが必要とするものによっては、正確な平等、またはおおよその平等があります。これはあなたのニーズに依存しますが、普遍的なルールはありません。 –

+0

[同等のためにjava.lang.Doubleをチェックする実行方法]の複製可能性(http://stackoverflow.com/questions/17971226/performant-way-to-check-java-lang-double-for-equality) – Dth

答えて

2

それはあなたのユースケースに依存します。通貨で作業する場合は、BigDecimalを使用してください。 近似で使用できる場合は、Math.abs(double1 - double2) < epsilon

-1

浮動小数点数は、表現可能な最小値であるイプシロン耐性と呼ばれます。フロートを比較するには、その差が許容範囲内であることを確認します。

Math.abs(a-b) <= EPSILON 

もちろん、倍数に収まらないほど大きな数値で作業している場合は、大きな数字の変形を使用する必要があります。 EPSILONはDouble.MIN_VALUEよりも数桁大きい許容差ですが、分散が無視できるほど十分に小さいです。あなたが平等をテストする場合

+0

' Double.MIN_VALUE'は可能な最小の正の 'double'、2 ^( - 1074)です。あなたの式は、 'abs(a-b)'がその値に等しいか、または0である場合にのみtrueを返します。 'Double.MIN_VALUE'はイプシロンとしての使用には適していません。 – ajb

+0

umm、2を掛けても助けになりません。とにかく、 'a'と' b'が等しくない場合、それらの差は2 ^( - 53)より小さくすることはできません。なぜなら、浮動小数点数が表現されているからです。 (そして、イプシロン2 ^( - 53)を作ることで応答しないでください。それでも許容範囲は小さすぎます) – ajb

0

あなたがおおよその平等、その後Math.abs(d1-d2) < epsilon

+0

等価性をテストするために 'Double.compare'を使う必要はありません。 '=='も同様です。 – ajb

0

を望む必要がある場合はそれが必要な精度のレベルに基づいて異なるだろうDouble.compare()またはBigDecimal.

を使用することができます。しかし、Java.lang.Double.equals()メソッドを見てください。

関連する問題