2012-01-06 9 views
5

No sé cómo manejar new BigDecimal("0E30"). Su valor es 0 pero no se puede comparar con BigDecimal.ZERO. Ver más abajo:0E30 no es cero

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

Podría alguien ayudarme a hacer la comparación verdadera (sé que puedo obtener una solución mediante la conversión de los BigDecimal s a double, pero me gustaría saber lo que está pasando)? Estoy usando JRE 1.6.3. gracias

Respuesta

7

Desde el docs (el subrayado es mío):

compara esta BigDecimal con el objeto especificado por la igualdad. diferencia de compareTo, este método considera dos BigDecimals iguales sólo si que son iguales en valor y escala (por lo tanto 2,0 no es igual a 2,00 cuando compararon por este método).

En este caso, la balanza no coincide con. Entonces, en su lugar, debe usar compareTo().

BigDecimal es uno de los casos en los que equals() es incompatible con compareTo():

Nota: se debe tener cuidado si BigDecimals se van a utilizar como teclas en un SortedMap o elementos en una SortedSet, tan natural de BigDecimal orden es incompatible con igual. Consulte Comparable, SortedMap o SortedSet para obtener más información.

1

De 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). 

Sus escalas son diferentes. Si quiere que sean iguales, use compareTo.