Saltar al contenido

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

Si encuentras algún detalle que no comprendes puedes dejarlo en los comentarios y trataremos de ayudarte lo mas rápido que podamos.

Solución:

Java previene la notación E en un doble:

Cinco formas diferentes de convertir un doble en un número 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 está confundido acerca de por qué esos dígitos aleatorios aparecen más allá de un cierto umbral en el valor doble, este video explica: computerphile ¿por qué 0.1+0.2 igual 0.30000000000001?

podrías usar printf() con %f:

double dexp = 12345678;
System.out.printf("dexp: %fn", dexp);

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

System.out.printf("dexp: %.0fn", dexp);

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

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

El valor por defecto toString() El formato utilizado en su código original se explica aquí.

En breve:

Si desea deshacerse de los ceros finales y los problemas de configuración regional, debe usar:

double myValue = 0.00000021d;

DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
df.setMaximumFractionDigits(340); // 340 = DecimalFormat.DOUBLE_FRACTION_DIGITS

System.out.println(df.format(myValue)); // Output: 0.00000021

Explicación:

Por qué otras respuestas no me convenían:

  • Double.toString() o System.out.println o FloatingDecimal.toJavaFormatString usa notaciones científicas si el doble es menor que 10^-3 o mayor o igual que 10^7
  • Mediante el uso %f, la precisión decimal predeterminada es 6; de lo contrario, puede codificarla, pero se agregarán ceros adicionales si tiene menos decimales. Ejemplo:

    double myValue = 0.00000021d;
    String.format("%.12f", myvalue); // Output: 0.000000210000
    
  • Mediante el uso setMaximumFractionDigits(0); o %.0f elimina cualquier precisión decimal, lo cual está bien para enteros/largos, pero no para el doble:

    double myValue = 0.00000021d;
    System.out.println(String.format("%.0f", myvalue)); // Output: 0
    DecimalFormat df = new DecimalFormat("0");
    System.out.println(df.format(myValue)); // Output: 0
    
  • Al usar DecimalFormat, eres dependiente local. En la configuración regional francesa, el separador decimal es una coma, no un punto:

    double myValue = 0.00000021d;
    DecimalFormat df = new DecimalFormat("0");
    df.setMaximumFractionDigits(340);
    System.out.println(df.format(myvalue)); // Output: 0,00000021
    

    El uso de la configuración regional INGLÉS asegura que obtenga un punto para el separador decimal, donde sea que se ejecute su programa.

¿Por qué usar 340 entonces para setMaximumFractionDigits?

Dos razones:

  • setMaximumFractionDigits acepta un número entero, pero su implementación tiene un máximo de dígitos permitidos de DecimalFormat.DOUBLE_FRACTION_DIGITS que es igual a 340
  • Double.MIN_VALUE = 4.9E-324 así que con 340 dígitos estás seguro de no redondear tu doble y perder precisión.

Puedes respaldar nuestro trabajo poniendo un comentario o valorándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *