25

のJavadocBigDecimalから:

BigDecimal注:オブジェクトが a のキーSortedMapまたは要素として使用される場合はSortedSetBigDecimal自然順序付けequals と一致しないため、注意が必要です。

たとえば、 a を作成してそれにHashSetと を追加するnew BigDecimal("1.0")と、セットには 2 つの要素が含まれます (値のスケールが異なるため、 と によるとnew BigDecimal("1.00")等しくないため)。ただし、 a で同じことを行うと、セットは次のようになります。を使用すると値が等しいと比較されるため、 には 1 つの要素のみが含まれます。equalshashCodeTreeSetcompareTo

この不一致の背後に特定の理由はありますか?

4

4 に答える 4

3

この動作は、後続のゼロが有効数字であり、1.0 が 1.00 と同じ意味を持たない算術精度のコンテキストでは妥当に見えます。それらを不平等にすることは合理的な選択のようです。

ただし、比較の観点から見ると、どちらも大きくも小さくもなく、Comparable インターフェースには合計順序が必要です (つまり、各 BigDecimal は他の BigDecimal と比較可能でなければなりません)。ここでの唯一の妥当なオプションは、compareTo メソッドが 2 つの数値を等しいと見なすように合計順序を定義することでした。

equal と compareTo の間の矛盾は、文書化されている限り問題ではないことに注意してください。まさに必要なものである場合もあります。

于 2013-11-07T07:32:19.987 に答える
2

答えはかなり短いです。equals() メソッドはオブジェクトを比較し、compareTo() は値を比較します。BigDecimal の場合、異なるオブジェクトが同じ値を表すことができます。これが、equals() が false を返し、compareTo() が 0 を返す理由です。

等しいオブジェクト => 等しい値

等しい値 =/> 等しいオブジェクト

オブジェクトは、実世界の値をコンピューターで表現したものにすぎません。たとえば、同じ画像が GIF 形式と JPEG 形式で表現される場合があります。これは、同じ値が異なる表現を持つ可能性がある BigDecimal に非常に似ています。

于 2013-11-07T06:26:11.550 に答える