Esas son dos preguntas separadas: "¿Para qué debo usar BigDecimal
?" y "¿Qué hago en general?"
Para BigDecimal
: esto es un poco complicado, porque no hacen lo mismo . BigDecimal.valueOf(double)
utilizará la representación canónicaString
del double
valor pasado para instanciar el BigDecimal
objeto. En otras palabras: el valor del BigDecimal
objeto será lo que vea cuando lo haga System.out.println(d)
.
new BigDecimal(d)
Sin embargo, si utiliza , BigDecimal
intentará representar el double
valor con la mayor precisión posible . Esto generalmente dará como resultado que se almacenen muchos más dígitos de los que desea. Estrictamente hablando, es más correcto que valueOf()
, pero es mucho menos intuitivo.
Hay una buena explicación de esto en JavaDoc:
Los resultados de este constructor pueden ser algo impredecibles. Se podría suponer que escribir new BigDecimal(0.1)
en Java crea un valor BigDecimal
exactamente igual a 0.1 (un valor sin escala de 1, con una escala de 1), pero en realidad es igual a 0.1000000000000000055511151231257827021181583404541015625. Esto se debe a que 0,1 no se puede representar exactamente como a double
(o, para el caso, como una fracción binaria de cualquier longitud finita). Por tanto, el valor que se pasa al constructor no es exactamente igual a 0,1, a pesar de las apariencias.
En general, si el resultado es el mismo (es decir, no en el caso de BigDecimal
, pero en la mayoría de los otros casos), entonces valueOf()
debería preferirse: puede realizar el almacenamiento en caché de valores comunes (como se ve en Integer.valueOf()
) e incluso puede cambiar el comportamiento de almacenamiento en caché sin la persona que llama debe cambiarse. siemprenew
creará una instancia de un nuevo valor, incluso si no es necesario (mejor ejemplo: vs. ).new Boolean(true)
Boolean.valueOf(true)