2015-04-23 7 views
5

Ich bin gerade auf ein Verhalten innerhalb von BigDecimal gestoßen, das mir vorher nicht bewusst war. ve verwendet sie immer als Alternative für Bereiche zu verdoppeln, wo Präzision wichtig ist. zum Beispiel in finanziellen Berechnungen.Gibt es andere Fehler, die BigDecimal ähnlich sind ("1.0"). Equals (new BigDecimal ("1") gibt false zurück?

jedoch vor kurzem ich auf diese Tatsache kam

new BigDecimal("1.0").equals(new BigDecimal("1")) == false 

ich ich war überrascht, dies zugeben. Ich nehme an, es ist so, weil das erste eine Skala von 1 hat, während das zweite eine Skala von 0 hat, aber immer noch scheint es kontraintuitiv zu sein Ich denke, der Grund, warum ich nie hatte rennen Sie davor, weil wir immer die feste Skala BigDecimals für finanzielle Berechnungen verwendet haben.

Überprüfung des BigDecimaldocumentation das sehe ich sagt, dass compareTo() == 0 verwendet werden soll, für die Gleichstellung zu ignorieren Maßstab zu überprüfen, während die equals() sowohl den Wert und die Skala vergleicht.

Gibt es noch andere ähnliche Fehler, die ich beachten sollte, wenn Sie BigDecimal s mit verschiedenen Maßstäben verwenden?

+1

Sie meinen nichts, was in den Java-Dokumenten nicht bereits dokumentiert wurde, glaube ich? – CKing

+4

Ein ähnliches Problem ist, dass 'new BigDecimal (0.1)' und 'BigDecimal.valueOf (0.1)' unterschiedliche Ergebnisse liefern.Die erste ist eine Darstellung des doppelten Wertes und wird etwas wie "0.100000000000000000055511151231257827021181583404541015625" sein, während die zweite "0.1" ist. – Powerlord

+2

In Verbindung stehend (mögliches Duplikat): http://stackoverflow.com/questions/19818537/why-is-bigdecimalnatural-ordering-inconsistent-with-equals – Maroun

Antwort

1

Nach JavaDoc der equals():

Im Gegensatz zu compareTo Dieses Verfahren berücksichtigt zwei BigDecimal Objekte gleich nur dann, wenn sie in Wert und Umfang gleich sind (also 2,0 nicht gleich 2,00, wenn mit dieser Methode im Vergleich) .

So equals() prüft, ob die Objekte genau der gleichen sind. compareTo() "nur" vergleicht ihren numerischen Wert.

+0

Ich glaube, dass der OP bereits den Grund für diesen speziellen Fall kennt. Er möchte von anderen solchen Gotachas wissen. – CKing

2

BigDecimal gleich überprüft, ob der Inhalt der beiden BigDecimal-Objekt gleich sind. z.B. Ihre toString() wäre das gleiche. Genau wie "1.0" und "1" sind nicht gleich, noch ist new BigDecimal("1.0").equals(new BigDecimal("1")) als die unscaledValue() und getScale() sind beide unterschiedlich.

Der Haken ist, dass, während Sie wusste, dass == würden die Inhalte nicht vergleichen, und Sie vielleicht gesagt worden .equals die Lösung für String ist, kann es nicht tun, was Sie für BigDecimal gedacht.

Für compareTo muss es arbeiten, was größer als oder kleiner als ist und da die Werte weder größer noch kleiner als sie nur sein können (aber nicht gleich).

Verwandte Themen