La classe BigDecimal
a quelques méthodes utiles pour garantir une conversion sans perte:
byteValueExact()
shortValueExact()
intValueExact()
longValueExact()
Cependant, les méthodes floatValueExact()
et doubleValueExact()
n'existent pas.
J'ai lu le code source d'OpenJDK pour les méthodes floatValue()
et doubleValue()
. Les deux semblent se replier sur Float.parseFloat()
et Double.parseDouble()
, respectivement, ce qui peut retourner l'infini positif ou négatif. Par exemple, l'analyse d'une chaîne de 10 000 9 renvoie un infini positif. Si je comprends bien, BigDecimal
n'a pas un concept interne de l'infini. En outre, l'analyse d'une chaîne de 100 9 comme double
donne 1.0E100
, ce qui n'est pas l'infini, mais perd en précision.
Qu'est-ce qu'une mise en œuvre raisonnable floatValueExact()
et doubleValueExact()
?
Je pensais à une double
solution en combinant BigDecimal.doubleValue()
, BigDecial.toString()
, Double.parseDouble(String)
et Double.toString(double)
, mais il semble en désordre. Je veux demander ici car il peut (doit!) Y avoir une solution plus simple.
Pour être clair, je n'ai pas besoin d'une solution performante.