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()
oSystem.out.println
oFloatingDecimal.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 deDecimalFormat.DOUBLE_FRACTION_DIGITS
que es igual a 340Double.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.