2009-05-29 27 views
23

¿Por qué este código a veces devuelve 1E + 1, mientras que para otras entradas (por ejemplo, 17) la salida no se imprime en notación científica?¿Por qué Java BigDecimal devuelve 1E + 1?

BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros(); 
System.out.println("value: " + bigDecimal); 

Respuesta

39

uso bigDecimal.toPlainString():

BigDecimal bigDecimal = BigDecimal.valueOf(100000.0) 
        .multiply(BigDecimal.valueOf(100d)) 
        .stripTrailingZeros(); 
System.out.println("plain  : " + bigDecimal.toPlainString()); 
System.out.println("scientific : " + bigDecimal.toEngineeringString()); 

salidas:

 
plain  : 10000000 
scientific : 10E+6 
+0

+1 para proporcionar una solución real en lugar de "aquí está el problema" como yo lo hice. :) –

+0

Respuestas como esta es lo que hace que Stackoverflow sea genial –

7

Es la conversión implícita .toString() que está sucediendo cuando se pasa el resultado en System.out.println().

+0

+1 para señalar el problema – dfa

3

La razón exacta para el comportamiento de BigDecimal.toString() se explica en el API doc en gran detalle (y cerca incomprensible).

Para obtener una representación textual coherente (y sensible a la configuración regional), debe usar DecimalFormat.

3

Básicamente porque no tiene suficientes dígitos significativos. Si multiplicas algo que solo tiene 1 dígito significativo con 100, entonces obtienes algo con solo 1 dígito significativo. Si muestra "10", eso básicamente dice que tiene 2 dígitos significativos. La forma de mostrar que solo tiene 1 dígito significativo es mostrar "1 x 10^1".

Los siguientes dos decimales tener el mismo valor (10), pero diferentes "escalas" (en el que empiezan a contar dígitos significativos; la parte superior tiene 2 sig higos, la parte inferior tiene 1):

System.out.println(new BigDecimal(BigInteger.TEN, 0)); // prints 10 
System.out.println(new BigDecimal(BigInteger.ONE, -1)); // prints 1E+1