Pregunta

El tipo de datos que puede representar un número decimal como " 10364055.81 " ;.

Si intenté usar doble:

double d = 10364055.81;

Pero cuando intento imprimir el número, se muestra como " 1.036405581E7 " ;, que no quiero.

¿Debo usar BigDecimal? Pero se muestra como 10364055.81000000052154064178466796875 . ¿Hay algún tipo de datos que muestre los valores tal como son? Además, el número puede ser mayor que el que se toma como ejemplo.

Por cierto, ¿el uso de BigDecimal afectará el rendimiento de la aplicación? Podría usar esto en casi todos mis DTO.

¿Fue útil?

Solución

Deberías usar BigDecimal, pero usar el constructor de cadenas , por ejemplo:

new BigDecimal("10364055.81");

Si pasa un double a BigDecimal, Java debe crear ese doble primero, y dado que los dobles no pueden representar la mayoría de las fracciones decimales con precisión, crea el valor como 10364055.81000000052154064178466796875 y luego lo pasa al constructor BigDecimal. En este caso, BigDecimal no tiene forma de saber que realmente querías decir la versión más completa.

En términos generales, el uso de constructores que no sean String de BigDecimal debe considerarse una advertencia de que no está obteniendo todos los beneficios de la clase.

Editar : basado en releer exactamente lo que querías hacer, mi reclamo inicial es probablemente demasiado fuerte. BigDecimal es una buena opción cuando necesita representar valores decimales con exactitud (el manejo del dinero es la opción obvia, no quiere que 5,99 * un millón sea 5990016.45 , por ejemplo).

Pero si no te preocupa que el número se almacene internamente como un valor muy diferente al literal decimal que ingresaste, y solo quieres imprimirlo de nuevo en el mismo formato, entonces como han dicho otros, una instancia de NumberFormat (en este caso, new DecimalFormat (" ########. ## ") ) funcionará el truco para dar salida al doble muy bien, o String.format puede hacer casi lo mismo.

En cuanto al rendimiento, BigDecimals será naturalmente más lento que el uso de primitivas. Sin embargo, generalmente, a menos que la gran mayoría de su programa implique manipulaciones matemáticas, es poco probable que note alguna diferencia de velocidad. Eso no quiere decir que debas usar BigDecimals por todas partes; sino que, si puede obtener un beneficio real de sus características que serían difíciles o imposibles de lograr con doubles , entonces no se preocupe por la minúscula diferencia de rendimiento que introducen teóricamente.

Otros consejos

La forma en que se muestra un número es distinta de cómo se almacena el número.

Eche un vistazo a DecimalFormat para controlar cómo puede mostrar sus números cuando doble (o flotante, etc.).

Tenga en cuenta que elegir BigDecimal sobre el doble (o viceversa) tiene ventajas y desventajas, y dependerá de sus requisitos. Consulte aquí para más información. Del resumen:

  

En resumen, si el rendimiento en bruto y   El espacio son los factores más importantes,   tipos primitivos de punto flotante son   apropiado. Si los valores decimales necesitan   Ser representado exactamente, de alta precisión.   Se necesita computación, o control fino   de redondeo solo se desea   BigDecimal tiene lo necesario   capacidades.

Un doble sería suficiente para guardar este número. Si su problema es que no le gusta el formato cuando lo imprime o lo pone en una Cadena, puede usar NumberFormat: http://java.sun.com/javase/6/docs/api/java/text/NumberFormat.html

puede usar doble y mostrar si con System.out.printf ().

double d = 100003.81;
System.out.printf("%.10f", d);

.10f - significa un doble con una precisión de 10

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top