A classe BigDecimalpossui alguns métodos úteis para garantir a conversão sem perdas:
byteValueExact()shortValueExact()intValueExact()longValueExact()
No entanto, métodos floatValueExact()e doubleValueExact()não existem.
Eu li o código fonte do OpenJDK para métodos floatValue()e doubleValue(). Ambos parecem ter fallback Float.parseFloat()e Double.parseDouble(), respectivamente, que podem retornar infinito positivo ou negativo. Por exemplo, analisar uma sequência de 10.000 9s retornará infinito positivo. Pelo que entendi, BigDecimalnão tem um conceito interno de infinito. Além disso, a análise de uma sequência de 100 9s como doubledá 1.0E100, que não é infinito, mas perde precisão.
O que é uma implementação razoável floatValueExact()e doubleValueExact()?
Eu pensei em uma doublesolução através da combinação BigDecimal.doubleValue(), BigDecial.toString(), Double.parseDouble(String)e Double.toString(double), mas parece confuso. Quero perguntar aqui, porque pode (deve!) Haver uma solução mais simples.
Para ser claro, não preciso de uma solução de alto desempenho.