2009-10-22 12 views
5

Qué tipo de datos es apto para representar un número decimal como "10364055.81".tipo de datos para representar un gran decimal en java

Si trató de usar doble:

double d = 10364055.81; 

Pero cuando trato de imprimir el número, su visualización como "1.036405581E7", lo que no quiero.

¿Debo usar BigDecimal? Pero se muestra como 10364055.81000000052154064178466796875. ¿Hay algún tipo de datos que muestre los valores tal como están? También el número puede ser más grande que el tomado como ejemplo.

BTW, ¿usará el efecto BigDecimal el rendimiento de la aplicación? Podría usar esto en casi todos mis DTO.

Respuesta

17

Debe usar BigDecimal - pero utilizar el constructor de String, por ejemplo:

new BigDecimal("10364055.81"); 

Si pasa un double a BigDecimal, Java debe crear ese primer doble - y puesto que los dobles no puede representar más decimal fracciones con precisión, hace crear el valor como 10364055.81000000052154064178466796875 y luego lo pasa al constructor de BigDecimal. En este caso, BigDecimal no tiene manera de saber que realmente quiso decir la versión más redonda.

Hablando en general, el uso de constructores de BigDecimal que no sean cadenas se debe considerar una advertencia de que no se obtienen los beneficios completos de la clase.

Editar - basado en volver a leer exactamente lo que quería hacer, mi reclamo inicial es probablemente demasiado fuerte. BigDecimal es una buena opción cuando necesita representar valores decimales exactamente (el manejo del dinero es la opción obvia, no quiere que 5.99 * un millón sea 5990016.45 por ejemplo).

Pero si usted no está preocupado por la cantidad que se almacena internamente como un valor ligeramente diferente a la del punto decimal literal que ha introducido, y sólo quiere imprimirlo de nuevo en el mismo formato, a continuación, como otros han dicho , una instancia de NumberFormat (en este caso, new DecimalFormat("########.##")) hará el truco para generar el doble muy bien, o String.format puede hacer más o menos lo mismo.

En cuanto al rendimiento: BigDecimals será, naturalmente, más lento que el uso de primitivos. Sin embargo, por lo general, 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 deba usar BigDecimales por todas partes; pero más bien, si puede obtener un beneficio real de sus características que sería difícil o imposible de realizar con simple doubles, entonces no se preocupe por la minúscula diferencia de rendimiento que teóricamente introducen.

+0

Bueno, creo que tienes razón. Pero un tipo de datos doble debe ser suficiente para ese número (solo dos decimales). Usar un BigDecimal donde un doble es suficiente puede causar un bajo rendimiento al hacer algunas operaciones. – sinuhepop

3

Cómo se muestra un número es distinto de cómo se almacena el número.

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

Tenga en cuenta que elegir BigDecimal por encima del doble (o viceversa) tiene pros/contras, y dependerá de sus requisitos. Vea here para más información. Del resumen:

En resumen, si el rendimiento bruto y espacio son los factores más importantes, tipos de coma flotante primitivos son apropiado. Si los valores decimales deben representarse exactamente , se necesita un cálculo de alta precisión , o un control fino de redondeo, solo BigDecimal tiene las capacidades necesarias.

1

puede usar double 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

Cuestiones relacionadas