La clase BigDecimal
tiene algunos métodos útiles para garantizar una conversión sin pérdidas:
byteValueExact()
shortValueExact()
intValueExact()
longValueExact()
Sin embargo, los métodos floatValueExact()
y doubleValueExact()
no existen.
Leí el código fuente de OpenJDK para métodos floatValue()
y doubleValue()
. Ambos parecen retroceder Float.parseFloat()
y Double.parseDouble()
, respectivamente, lo que puede devolver un infinito positivo o negativo. Por ejemplo, analizar una cadena de 10,000 9s devolverá un infinito positivo. Según tengo entendido, BigDecimal
no tiene un concepto interno de infinito. Además, analizando una cadena de 100 9s como double
da 1.0E100
, que no es infinito, pero pierde precisión.
¿Qué es una implementación razonable floatValueExact()
y doubleValueExact()
?
Pensé en una double
solución mediante la combinación de BigDecimal.doubleValue()
, BigDecial.toString()
, Double.parseDouble(String)
y Double.toString(double)
, pero se ve desordenado. Quiero preguntar aquí porque puede (¡debe!) Haber una solución más simple.
Para ser claros, no necesito una solución de alto rendimiento.