A classe BigDecimal
possui 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, BigDecimal
não tem um conceito interno de infinito. Além disso, a análise de uma sequência de 100 9s como double
dá 1.0E100
, que não é infinito, mas perde precisão.
O que é uma implementação razoável floatValueExact()
e doubleValueExact()
?
Eu pensei em uma double
soluçã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.