La clase BigDecimaltiene 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, BigDecimalno tiene un concepto interno de infinito. Además, analizando una cadena de 100 9s como doubleda 1.0E100, que no es infinito, pero pierde precisión.
¿Qué es una implementación razonable floatValueExact()y doubleValueExact()?
Pensé en una doublesolució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.