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.
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