2012-01-06 11 views
5

Nie wiem jak obsługiwać new BigDecimal("0E30"). Jego wartość to 0, ale nie porównuje się z BigDecimal.ZERO. Patrz poniżej:0E30 nie jest ZERO

System.out.println(new BigDecimal("0E30").add(BigDecimal.ONE));  // ---> 1 
System.out.println(new BigDecimal("0E30").equals(BigDecimal.ZERO)); // ---> false 

Może ktoś mi pomóc dokonać porównania prawdziwe (wiem, że mogę dostać obejście poprzez przekształcenie BigDecimal s do double, ale chciałbym wiedzieć, co się dzieje)? Używam środowiska JRE 1.6.3. dzięki

Odpowiedz

7

Z docs (podkreślenie moje):

porównuje BigDecimal z określonego obiektu dla równości. przeciwieństwie CompareTo sposób ten uwzględnia dwa BigDecimals równe tylko wtedy, gdy są one równe wartości i skalę (a więc nie jest równy 2,0 do 2,00, gdy porównaniu z tym sposobem).

W tym przypadku skala nie pasuje do. Zamiast tego powinieneś użyć compareTo().

BigDecimal jest jednym z przypadków, gdzie equals() jest niezgodna z compareTo():

Uwaga: należy zachować ostrożność, jeśli BigDecimals mają być używane jako klucze w SortedMap lub elementów w SortedSet, jak BigDecimal naturalna Zamawianie jest niespójne z równymi. Aby uzyskać więcej informacji, zobacz Porównywalne, SortowaneMap lub SortedSet.

1

Od the docs:

public boolean equals(Object x) 

    Compares this BigDecimal with the specified Object for equality. 
    Unlike compareTo, this method considers two BigDecimal objects equal 
    only if they are equal in value and scale (thus 2.0 is not equal to 
    2.00 when compared by this method). 

Twoje skale są różne. Jeśli chcesz je porównać równy, użyj compareTo.

Powiązane problemy