¿Cómo imprimo un valor doble sin notación científica usando Java?

Resuelto Despicable asked hace 11 años • 17 respuestas

Quiero imprimir un valor doble en Java sin forma exponencial.

double dexp = 12345678;
System.out.println("dexp: "+dexp);

Muestra esta notación E: 1.2345678E7.

Quiero que lo imprima así:12345678

¿Cuál es la mejor manera de prevenir esto?

Despicable avatar Apr 19 '13 12:04 Despicable
Aceptado

Java impide la notación E en un doble:

Cinco formas diferentes de convertir un número doble en normal:

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class Runner {
    public static void main(String[] args) {
        double myvalue = 0.00000021d;

        //Option 1 Print bare double.
        System.out.println(myvalue);

        //Option2, use decimalFormat.
        DecimalFormat df = new DecimalFormat("#");
        df.setMaximumFractionDigits(8);
        System.out.println(df.format(myvalue));

        //Option 3, use printf.
        System.out.printf("%.9f", myvalue);
        System.out.println();

        //Option 4, convert toBigDecimal and ask for toPlainString().
        System.out.print(new BigDecimal(myvalue).toPlainString());
        System.out.println();

        //Option 5, String.format 
        System.out.println(String.format("%.12f", myvalue));
    }
}

Este programa imprime:

2.1E-7
.00000021
0.000000210
0.000000210000000000000001085015324114868562332958390470594167709350585
0.000000210000

Que son todos del mismo valor.

Consejo profesional: si no sabe por qué esos dígitos aleatorios aparecen más allá de cierto umbral en el valor doble, este video explica: informático, ¿por qué 0.1+ es 0.2igual 0.30000000000001?

http://youtube.com/watch?v=PZRI1IfStY0

Eric Leschinski avatar Jan 05 '2014 18:01 Eric Leschinski

Podrías usar printf()con %f:

double dexp = 12345678;
System.out.printf("dexp: %f\n", dexp);

Esto se imprimirá dexp: 12345678.000000. Si no quieres la parte fraccionaria, usa

System.out.printf("dexp: %.0f\n", dexp);

0 en %.0fsignifica 0 lugares en parte fraccionaria, es decir, sin parte fraccionaria. Si desea imprimir una parte fraccionaria con el número deseado de decimales, en lugar de 0, proporcione un número como este %.8f. Por defecto, la parte fraccionaria se imprime con hasta 6 decimales.

Esto utiliza el lenguaje del especificador de formato explicado en la documentación .

El formato predeterminado toString()utilizado en su código original se detalla aquí .

NPE avatar Apr 19 '2013 05:04 NPE