Convertir float double sans perdre de précision
J'ai une primitive de flotteur et j'ai besoin aussi d'une primitive double. Tout simplement couler le flotteur à double me donne bizarre une précision supplémentaire. Par exemple:
float temp = 14009.35F;
System.out.println(Float.toString(temp)); //Prints 14009.35
System.out.println(Double.toString((double)temp)); //Prints 14009.349609375
Toutefois, si, au lieu de casting, j'ai sortie le flotteur comme une chaîne de caractères, et d'analyser la chaîne comme un double, j'obtiens ce que je veux:
System.out.println(Double.toString(Double.parseDouble(Float.toString(temp))));
//Prints 14009.35
Est-il un meilleur moyen que d'aller à la Chaîne et à l'arrière?
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas que vous êtes fait plus de précision, c'est que le flotteur ne pas représenter avec précision le nombre vous visaient à l'origine. Le double est représentant l'original flotteur avec précision;
toString
est de montrer les "extra" des données qui étaient déjà présents.Par exemple (et ces chiffres ne sont pas de droite, je suis juste rendre les choses jusqu') supposons que vous avez eu:
Alors la valeur de
f
pourrait être exactement 0.100000234523.d
aura exactement la même valeur, mais quand vous convertir en une chaîne de "confiance" que c'est exact pour une plus grande précision, afin de ne pas arrondir comme au début, et vous verrez les "chiffres supplémentaires", qui étaient déjà là, mais caché.Lors de la conversion en chaîne de caractères et à l'arrière, vous êtes de se retrouver avec une double valeur qui est plus proche de la chaîne de valeur que l'original float - mais, c'est seulement une bonne si croyez-vous vraiment que la chaîne de la valeur est ce que vous avez vraiment voulu.
Êtes-vous sûr que float/double sont les types appropriés à utiliser, ici au lieu de
BigDecimal
? Si vous essayez d'utiliser les nombres qui ont précise des valeurs décimales (par exemple de l'argent), puisBigDecimal
est plus approprié de type OMI.Je trouve la conversion de la représentation binaire plus facile à appréhender ce problème.
Vous pouvez voir le flotteur est élargi pour le double par l'ajout de 0s à la fin, mais que la double représentation de 0,27 est "plus précis", donc le problème.
C'est en raison du contrat de
Float.toString(float)
, qui dit en partie:J'ai rencontré ce problème aujourd'hui et ne pouvait pas utiliser refactoriser à BigDecimal, parce que le projet est vraiment énorme. Cependant, j'ai trouvé la solution à l'aide de
Et cela fonctionne.
Noter que l'appel de résultat.doubleValue() renvoie 5623.22998046875
Mais en l'appelant doubleResult.doubleValue() renvoie correctement 5623.23
Mais je ne suis pas entièrement sûr si ses une bonne solution.
Utiliser un
BigDecimal
au lieu defloat
/double
. Il y a beaucoup de chiffres qui ne peuvent pas être représentés en virgule flottante binaire (par exemple,0.1
). Donc vous devez toujours arrondir le résultat à une précision ou l'utilisationBigDecimal
.Voir http://en.wikipedia.org/wiki/Floating_point pour plus d'informations.
BigDecimal
n'. C'est unBigInteger
plus la position de la virgule décimale.BigDecimal
depuis que va attraper la plupart des erreurs courantes. Si les choses sont trop lents, ils ont besoin de pour en savoir plus et trouver des moyens d'optimiser leurs problèmes. L'optimisation prématurée est la racine de tous les maux - D. E. Knuth.J'ai trouvé la solution suivante:
Si vous utilisez float et double au lieu de Float et Double utiliser les éléments suivants:
Flotteurs, par nature, sont imprécises et ont toujours soigné arrondissement "questions". Si la précision est importante, alors vous pourriez envisager de la refactorisation de votre application pour utiliser Décimal ou BigDecimal.
Oui, les chars de calcul plus rapide que les décimales en raison de la prise en charge des processeurs. Toutefois, voulez-vous rapide ou précis?
Pour plus d'informations, ce qui vient en vertu de l'Article 48 - Éviter les float et double lorsque les valeurs exactes sont nécessaires, Efficaces Java 2nd edition de Joshua Bloch. Ce livre est bourré avec de bonnes choses, et certainement en valeur un regard.
Fait ce travail?