2011-09-23 34 views
5
BigDecimal bd= new BigDecimal("00.0000000000"); 
//now bd format to 0E-10 
if(BigDecimal.ZERO.equals(bd) || bd.equals("0E-10")) 
{ 
flag=true; 
} 

hay dos problemas en el código anteriorBigDecimal Problema en java

  1. por qué variable de bd formato automáticamente a 0E-10
  2. si los resultados condición falsa valor, es decir, no ingresa dentro de si el bloque.

¿Alguien puede sugerirme? gracias

Respuesta

12

Usted ha dado el constructor diez dígitos después del punto decimal, por lo que a pesar de que todos ellos son cero, BigDecimal ha decidido establecer su interior scale a 10. Esto explica la -10 en "0E-10".

En cuanto a equals, el Javadoc says:

compara esta BigDecimal con el Object especificada por la igualdad. A diferencia de compareTo, este método considera dos objetos BigDecimal equivalentes a solo si son iguales en valor y escala (por lo tanto, 2.0 no es igual a 2.00 si se compara con este método).

En pocas palabras:

  1. compareTo() uso en lugar de equals().
  2. No compare directamente BigDecimal con String ya que esto no funcionará.
5

Puede comprobar cero utilizando

bd.signum() == 0 

BigDecimal.equals también incluye la escala (que es 10 en su caso) y por lo tanto falla. En general, debe usar compareTo para comparar BigDecimals.

1

BigDecimal utiliza una escala de 10 porque le ha dado diez dígitos después del punto decimal, que responde a su primer punto.

Para el si, para la primera parte, está comparando 0 con 00.00000000000 (la escala es diferente, por lo que no son lo mismo). En el segundo, estás comparando una Cadena con un BigDecimal. Lo cual no funcionará