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?
Puedes 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 fraccional, usa
System.out.printf("dexp: %.0f\n", dexp);
Utiliza el lenguaje especificador de formato explicado en la documentación .
El toString()
formato predeterminado utilizado en su código original se detalla aquí .
dexp: 12345681.000000
cuál es el valor incorrecto. Y, en realidad, después de eso quiero mostrarlo en mi página web donde se muestra de esta manera1.2345678E7
. ¿Hay12345678
alguna forma de que pueda almacenarlo en cualquier doble y de otra manera?%.0f
.%.0f
Redondea el número. ¿Hay alguna forma de descartar los ceros finales?Java evita la notación E en un doble:
Cinco formas diferentes de convertir un número doble en un número normal:
Este programa imprime:
Que son todos del mismo valor.
Protip: Si está confundido acerca de por qué esos dígitos aleatorios aparecen más allá de cierto umbral en el valor doble, este video explica: computerphile ¿por qué
0.1
+ es0.2
igual0.30000000000001
?http://youtube.com/watch?v=PZRI1IfStY0
fuente
En breve:
Si desea deshacerse de los ceros finales y los problemas de configuración regional, debe usar:
Explicación:
Por qué otras respuestas no me convenían:
Double.toString()
oSystem.out.println
oFloatingDecimal.toJavaFormatString
utiliza notación científica si doble es menos de 10 ^ -3 o mayor que o igual a 10 ^ 7Al usar
%f
, la precisión decimal predeterminada es 6, de lo contrario, puede codificarla, pero da como resultado ceros adicionales agregados si tiene menos decimales. Ejemplo:Al usar
setMaximumFractionDigits(0);
o%.0f
eliminar cualquier precisión decimal, lo cual está bien para enteros / largos, pero no para el doble:Al usar DecimalFormat, usted es dependiente local. En el idioma francés, el separador decimal es una coma, no un punto:
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 losDecimalFormat.DOUBLE_FRACTION_DIGITS
cuales es igual a 340Double.MIN_VALUE = 4.9E-324
así que con 340 dígitos está seguro de no redondear su doble y perder precisión.fuente
new BigDecimal(myvalue).toPlainString()
De la descripción en docs.oracle.com/javase/7/docs/api/java/math/… ), no es inmediatamente obvio cómo se comporta cuando se le dan diferentes tipos de números, pero elimina la notación científica .new BigDecimal(0.00000021d).toPlainString()
salida0.0000002100000000000000010850153241148685623329583904705941677093505859375
que no es lo que esperarías ...BigDecimal.valueOf(0.00000021d).toPlainString()
funciona bien (usa el constructor de cadenas de BigDecimal por eso)Puedes probarlo con
DecimalFormat
. Con esta clase eres muy flexible al analizar tus números.Puede establecer exactamente el patrón que desea usar.
En su caso, por ejemplo:
fuente
Tengo otra solución que involucra a BigDecimal's toPlainString (), pero esta vez usando el constructor de cadenas, que se recomienda en el javadoc:
Se ve así en su forma más corta:
Antes de Java 8, esto da como resultado "0.0" para cualquier Dobles de valor cero, por lo que deberá agregar:
NaN e infinitos valores tienen que ser verificados extra.
El resultado final de todas estas consideraciones:
Esto también se puede copiar / pegar para que funcione bien con Float.
fuente
d.doubleValue() == 0
lugar ded == 0
?Esto funcionará siempre que su número sea un número entero:
Si la variable doble tiene precisión después del punto decimal, la truncará.
fuente
Necesitaba convertir algunos valores de doble a moneda y descubrí que la mayoría de las soluciones estaban bien, pero no para mí.
El
DecimalFormat
fue finalmente el camino para mí, así que aquí es lo que he hecho:Como puede ver, si el número es natural, obtengo, digamos, 20000000 en lugar de 2E7 (etc.), sin ningún punto decimal.
Y si es decimal, solo obtengo dos dígitos decimales.
fuente
El compilador Java / Kotlin convierte cualquier valor mayor que 9999999 (mayor o igual a 10 millones) a notación científica, es decir. Notación de Epsilion .
Ej: 12345678 se convierte a 1.2345678E7
Use este código para evitar la conversión automática a notación científica:
fuente
El siguiente código detecta si el número proporcionado se presenta en notación científica. Si es así, se representa en una presentación normal con un máximo de '25' dígitos.
fuente
Creo que todos tuvieron la idea correcta, pero todas las respuestas no fueron sencillas. Puedo ver que este es un código muy útil. Aquí hay un fragmento de lo que funcionará:
el
".8"
es donde establece el número de decimales que le gustaría mostrar.Estoy usando Eclipse y no funcionó.
Espero que esto haya sido útil. ¡Le agradecería cualquier comentario!
fuente
Tuve el mismo problema en mi código de producción cuando lo estaba usando como una entrada de cadena para una función matemática. Eval () que toma una cadena como "x + 20/50"
Miré cientos de artículos ... Al final fui con esto debido a la velocidad. Y debido a que la función Eval iba a convertirlo nuevamente en su propio formato de número y math.Eval () no admitía el E-07 final que devolvieron otros métodos, y cualquier cosa por encima de 5 dp era demasiado detalle para mi aplicación de todos modos .
Esto ahora se usa en el código de producción para una aplicación que tiene más de 1,000 usuarios ...
fuente
Esto puede ser una tangente ... pero si necesita poner un valor numérico como un entero (que es demasiado grande para ser un entero) en un serializador (JSON, etc.), entonces probablemente desee "BigInterger"
Ejemplo: el valor es una cadena - 7515904334
Necesitamos representarlo como un número en un mensaje Json: {"contact_phone": "800220-3333", "servicer_id": 7515904334, "servicer_name": "ALGUNA CORPORACIÓN"}
No podemos imprimirlo o obtendremos esto: {"contact_phone": "800220-3333", "servicer_id": "7515904334", "servicer_name": "ALGUNA CORPORACIÓN"}
Agregar el valor al nodo de esta manera produce el resultado deseado: BigInteger.valueOf (Long.parseLong (valor, 10))
No estoy seguro de que esto sea realmente sobre el tema, pero dado que esta pregunta fue mi mayor éxito cuando busqué mi solución, pensé que compartiría aquí en beneficio de otros, mentiré, quienes buscan mal. :RE
fuente
Para los valores enteros representados por a
double
, puede usar este código, que es mucho más rápido que las otras soluciones.fuente
Mi solución: String str = String.format ("% .0f", yourDouble);
fuente