J'ai un flotteur primitif et j'en ai besoin comme double primitif. Le simple fait de lancer le flotteur pour doubler me donne une précision supplémentaire étrange. 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
Cependant, si au lieu de lancer un cast, je produis le float sous forme de chaîne et analyse 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
Y a-t-il un meilleur moyen que d'aller à String et revenir?
la source
J'ai trouvé la solution suivante:
Si vous utilisez float et double au lieu de Float et Double, utilisez ce qui suit:
la source
Utilisez un
BigDecimal
au lieu defloat
/double
. Il y a beaucoup de nombres qui ne peuvent pas être représentés en virgule flottante binaire (par exemple,0.1
). Vous devez donc toujours arrondir le résultat à une précision ou à une utilisation connueBigDecimal
.Voir http://en.wikipedia.org/wiki/Floating_point pour plus d'informations.
la source
BigDecimal
car cela permettra de détecter la plupart des erreurs courantes. Si les choses sont trop lentes, ils doivent en savoir plus et trouver des moyens d'optimiser leurs problèmes. L'optimisation prématurée est la racine de tout mal - DE Knuth.Les flotteurs, par nature, sont imprécis et ont toujours des «problèmes» d'arrondi soignés. Si la précision est importante, vous pouvez envisager de refactoriser votre application pour utiliser Decimal ou BigDecimal.
Oui, les flottants sont plus rapides que les nombres décimaux en raison de la prise en charge du processeur. Cependant, voulez-vous rapide ou précis?
la source
Pour information, ceci relève de l'article 48 - Évitez les flottants et doublez lorsque des valeurs exactes sont requises, de Effective Java 2nd edition par Joshua Bloch. Ce livre regorge de bonnes choses et vaut vraiment le détour.
la source
Est-ce que ça marche?
la source
Une solution simple qui fonctionne bien consiste à analyser le double à partir de la représentation sous forme de chaîne du float:
Pas super efficace, mais ça marche!
la source