Double de la valeur à arrondir en Java
J'ai une double valeur = 1.068879335
je veux le tour, avec seulement deux valeurs décimales comme 1.07.
J'ai essayé comme ceci
DecimalFormat df=new DecimalFormat("0.00");
String formate = df.format(value);
double finalValue = Double.parseDouble(formate) ;
ce qui me donne cette exception suivante
java.lang.NumberFormatException: For input string: "1,07"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
at java.lang.Double.parseDouble(Double.java:510)
peut-on me dire quel est le problème avec mon code.
finalement j'ai besoin de la finalValue = 1.07;
- si vous autour de cette place, 1.085879335, 2 chiffres de précision, il sera 1.08 1.09 et s'arrondir. comment vous voulez obtenir 1.07 de 1.085879335?
Vous devez vous connecter pour publier un commentaire.
Notez la virgule dans votre chaîne de caractères: "1,07".
DecimalFormat
utilise les paramètres régionaux spécifiques séparateur de chaîne, tandis queDouble.parseDouble()
ne le fait pas. Comme vous vivez dans un pays où le séparateur décimal est le ",", vous ne pouvez pas analyser votre numéro de retour.Cependant, vous pouvez utiliser le même
DecimalFormat
analyser dos:Mais vous devriez vraiment faire ceci à la place:
Remarque: Comme cela a été souligné, vous ne devez utiliser de virgule flottante si vous n'avez pas besoin d'un contrôle précis sur la précision. (Calculs financiers étant le principal exemple lorsque pas de l'utiliser.)
Live @Sergey est une solution, mais avec une division entière.
imprime
EDIT: Sergey points, il devrait y avoir aucune différence entre multipling double*int et double*double et en divisant double/int et double/double. Je ne peux pas trouver un exemple où le résultat est différent. Cependant sur x86/x64 et d'autres systèmes, il existe une machine spécifique du code d'instruction mixte, double,int valeurs qui, je crois, la JVM utilise.
Imprime
Math.round(value * 100) / 100.0
. C'est juste une question de style. Si vous avez utilisé une véritable division entière, vous obtiendrez 23 comme résultat.Le problème est que vous utilisez une localisation formateur qui génère les paramètres régionaux en point décimal, ce qui est "," dans votre cas. Mais Double.parseDouble() s'attend à ce non-localisée double littérale. Vous pourriez résoudre votre problème à l'aide d'une analyse spécifique aux paramètres régionaux de la méthode ou par l'évolution des paramètres régionaux de votre formateur à quelque chose qui utilise le "." comme séparateur de décimales. Ou encore mieux, éviter de mise en forme en utilisant quelque chose comme ceci:
Il y a quelque chose de fondamentalement mauvais dans ce que vous essayez de faire. Variable binaire-les points ne sont pas ont décimales. Vous ne pouvez pas véritablement un tour à un nombre de décimales, parce que la plupart des "ronde" les valeurs décimales ne peut tout simplement pas être représenté comme une fraction binaire. C'est pourquoi on ne devrait jamais utiliser
float
oudouble
pour représenter de l'argent.Donc, si vous voulez chiffres après la virgule dans le résultat, ce résultat doit être un
String
(dont vous avez déjà eu avec laDecimalFormat
), ou unBigDecimal
(qui a unsetScale()
méthode qui fait exactement ce que vous voulez). Sinon, le résultat ne peut pas être ce que vous voulez qu'il soit.Lire La Virgule Flottante Guide pour plus d'informations.
Essayez ceci:
org.apache.commons.math3.util.La précision.round(double x, int échelle)
Voir:
http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/util/Precision.html
Apache Commons Bibliothèque de Mathématiques page d'accueil est:
http://commons.apache.org/proper/commons-math/index.html
Internes de mise en œuvre de cette méthode est:
Vous pourriez essayer de définir un nouveau DecimalFormat et en l'utilisant comme un Double résultat à une nouvelle variable de type double.
Exemple pour vous faire comprendre ce que je viens de dire.
Ce n'est pas possible dans la forme requise, car il y a des nombres avec deux chiffres après la virgule qui ne peut pas être exprimée en utilisant exactement à virgule flottante IEEE de chiffres (par exemple 1/10 = 0.1 ne peut pas être exprimé comme une
Double
ouFloat
). La mise en forme doit toujours se passer comme la dernière étape avant de présenter le résultat à l'utilisateur.Je suppose que vous demandez, parce que vous voulez traiter avec des valeurs monétaires. Il n'y a aucun moyen de le faire de manière fiable avec des nombres à virgule flottante, vous devriez envisager de passer à virgule fixe l'arithmétique. Cela signifie probablement faire tous les calculs en "cents" au lieu de "dollars".
Vous pouvez utiliser le format comme ici,
Si vous ne souhaitez pas utiliser DecimalFormat (par exemple, en raison de son efficacité) et vous souhaitez une solution générale, vous pouvez également essayer cette méthode qui utilise l'échelle arrondissement: