ejemplo java numbers precision bigdecimal

java - ejemplo - jpa bigdecimal



Convertir Java Number a BigDecimal: la mejor manera (2)

¿Podemos perder precisión con el método toString ()?

Tipo de ... Ambos Float.toString() y Double.toString() solo Double.toString() el número de dígitos después del separador decimal, que se requiere para que la salida se corresponda de forma exclusiva con un valor flotante o doble.

Para usar el ejemplo 0.35 en la respuesta de david99world, considere el siguiente código:

BigDecimal bd1 = new BigDecimal(0.35); Number n = 0.35; BigDecimal bd2 = new BigDecimal(n.toString()); System.out.println(bd1); System.out.println(bd2);

Una expectativa intuitiva puede ser que las dos instancias de BigDecimal sean idénticas, pero el resultado muestra que no lo son:

0.34999999999999997779553950749686919152736663818359375 0.35

La primera línea es el valor exacto del doble, ya que 0.35 no se puede representar exactamente. La segunda línea es 0.35, ya que no se requieren más dígitos fraccionarios para representar el valor distinto. Por ejemplo, la afirmación 0.34999999999999997779553950749686919152736663818359375 == 0.35 evaluará a true .

En realidad, no es una pérdida de precisión al crear BigDecimal, la incertidumbre ya está presente en su valor "fuente". El problema es más bien que los valores discretos posibles utilizando, por ejemplo, un valor flotante o doble como fuente, no necesariamente estarán representados por el equivalente exacto en la instancia de BigDecimal.

Estoy buscando la mejor manera de convertir un número a un BigDecimal.

¿Es esto lo suficientemente bueno?

Number number; BigDecimal big = new BigDecimal(number.toString());

¿Podemos perder precisión con el método toString() ?


Esto está bien, recuerda que usar el constructor de BigDecimal para declarar un valor puede ser peligroso cuando no es de tipo String. Considere lo siguiente ...

BigDecimal valDouble = new BigDecimal(0.35); System.out.println(valDouble);

Esto no imprimirá 0.35, de hecho será ...

0.34999999999999997779553950749686919152736663818359375

Yo diría que tu solución es probablemente la más segura por eso.