JAVA : Nombre de chiffres après la virgule [Résolu/Fermé]

- - Dernière réponse : Nicoolasens
Messages postés
5
Date d'inscription
lundi 21 mars 2016
Statut
Membre
Dernière intervention
13 septembre 2016
- 13 sept. 2016 à 14:29
Bonjour !

Je souhaiterai savoir s'il existe des méthodes pour préciser le nombre de chiffres après la virgule dans un Double en JAVA.

Les double et les float sont dits à "virgule flottante", c'est à dire que le nombre de chiffres avant et après la virgule n'est pas défini.

Mais peut on tout de même forcer ce nombre ?


Merci d'avance pour vos réponses !
Afficher la suite 

8 réponses

Meilleure réponse
37
Merci
Salut voici un exemple mais je te conseil pas de l'utiliser si tu souhaites arrondir ta valeur pour recuperer un double à la fin car la classe DecimalFormat te renvoie un objet du type texte à moins que tu connais une methode qui convertit les objets du type texte en double.Je connais une autre methode permetant pour le faire mais je m'en souviens plus si je me rappel je te le dirais.
Pour utiliser il faut importer le packetage java.text.*;
et voila:
DecimalFormat df = new DecimalFormat ( ) ;
df.setMaximumFractionDigits ( 2 ) ; //arrondi à 2 chiffres apres la virgules
df.setMinimumFractionDigits ( 2 ) ;
df.setDecimalSeparatorAlwaysShown ( true ) ;
System.out.println ( Double.parseDouble(df.format ( -4.327))); //cela t'affiche -4,33
System.out.println ( df.format ( 2174534.3279 ) ) ; //2,174,534,33
Bon courage te bonne chance!

Dire « Merci » 37

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 70341 internautes nous ont dit merci ce mois-ci

KX
Messages postés
16075
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 novembre 2019
2455 -
Sinon : System.out.printf("%.3f\n",1234.56789); // 1234,568
Ici le %.3f veut dire nombre flottant avec 3 chiffres après la virgule.
KX ça c'est du C++ --'
KX
Messages postés
16075
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 novembre 2019
2455 -
Dans ce cas là, ce serait du C plus que du C++ (où l'on utiliserait std::cout << std::setprecision (3) << f;)

La méthode PrintStream printf(String,Object...) existe en Java, et elle fonctionne très bien sur System.out
À voir aussi : la méthode String.format(String,Object...) que l'on pourrait comparer au sprintf en C.
Une description de ce qu'elle permet de faire se trouve dans la documentation de java.util.Formatter
33
Merci
J ai une solution ki ne demande pas de convertir en string^^
double toto=321.6584;
toto=(double)((int)(toto*100))/100;
Je vois vraiment pas l'intérêt de perdre toute la précision de ta valeur pour garder le même type.
13
Merci
double mon_nombre = 123.9857133413413;
DecimalFormat df = new DecimalFormat("########.00");
String str = df.format(mon_nombre);
mon_nombre = Double.parseDouble(str.replace(',', '.'));
System.out.println(mon_nombre);
C'est merveilleux merci beaucoup
double mon_nombre = 123.9857133413413;
DecimalFormat df = new DecimalFormat(00000.00");
System.out.println(df.format(mon_nombre));

résultat -> 00123.99
Merci beaucoup alino, ta reponse est très complete
Messages postés
30
Date d'inscription
lundi 21 octobre 2002
Statut
Membre
Dernière intervention
22 juillet 2003
12
8
Merci
Exple : Si tu veux 2 chiffres après la virgule :

DecimalFormat df = new DecimalFormat("########.00");
System.out.println(df.format(mon_nombre));
2
Merci
merci pour ton exemple, il m'a bien servi !

Ciao
Neurone
1
Merci
merci beaucoup jay_J ton exemple ma aider et ca marche trés bien
Messages postés
5
Date d'inscription
lundi 21 mars 2016
Statut
Membre
Dernière intervention
13 septembre 2016
1
1
Merci
Bonjour, la discussion est vielle, mais ne propose pas la réponse que je voulais. J'ai une solution que je trouve plus simple et qui n'a pas besoin de convertir votre nombre en String, elle utilise seulement une fonction de java.lang.Math. (round)

/*
Sur Android, on peut avoir besoin de faire un arrondi.

Les méthodes que l'on trouve sur internet font parfois intervenir des strings ou des
calculs un peu alambiqués alors qu'il existe une méthode java.lang.Math.round() qui
suffit à faire le travail.

Round, est une fonction qui existe en php, mais forcément, en java, tout est réécrit.
Heureusement les mots sont ceux du dico anglais.

Ainsi, si je veux faire un arrondi à la 2ème décimale, je vais d'abord faire un arrondi sur mon nombre mulitiplié par 100, puis le diviser par 100. Attention, cela se fait en 2 étapes, sinon votre nombre sera tronqué.
  • /


float myValue = java.lang.Math.round(intent.getFloatExtra("unFloat", 7) * 3 *100);
myValue = myValue/100; //On ne divise qu'à ce moment.


/*
Nous avons donc

_un float (ici récupéré depuis une autre activité (intent, vous pouvez le remplacer par votre float. Le 7 ne nous intéresse pas dans notre cas car c'est juste une valeur par défaut en cas d'échec de la récupération du float sur l'autre activité))

_multiplié par 3 (histoire de faire un calcul pour l'exemple)

_puis le reste sert à obtenir un float à 2 décimales, pour avoir 3 chiffres après la virgule on change 100 par 1000, etc.
  • /


Pourquoi cette méthode est utile ?

Sur Android, pour une raison que j'ignore, (peut-être une histoire de changement de nombres en objets), des décimales superflues sont ajoutées aux nombres.
Si bien que lorsqu'on multiplie un nombre comme 265.6 par 3 le résultat sur Android est 796.8000001 alors que le résultat réel est évidemment 796.8.
C'est souvent une différence minime mathématiquement parlant (en tout cas pour un physicien) mais ça devient vite disgracieux si l'on a pas pris la précaution de formater le résultat attendu.

A toute fin utile, je vous joins java.lang.Math pour d'autres utilisations mathématiques.

http://developer.android.com/reference/java/lang/Math.html
Voilà, j'espère que je vous ai fait gagner du temps.
KX
Messages postés
16075
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 novembre 2019
2455 -
"la discussion est vielle, mais ne propose pas la réponse que je voulais"
Il y a un lien de cause à effet là dedans : la discussion date de 2003, Android n'existait pas encore (créé en 2007), il est donc normal que personne n'en parle.

"Round, est une fonction qui existe en php, mais forcément, en java, tout est réécrit."
Encore un anachronisme, tu sous-entends que Java a tout piqué à PHP, mais Java date de 1990 et PHP de 1994... Et de toute façon round existait déjà en C (1970)

"lorsqu'on multiplie un nombre comme 265.6 par 3 le résultat sur Android est 796.8000001 alors que le résultat réel est évidemment 796.8"
C'est parce que l'ordinateur compte en base 2 et toi en base 10.
265.6=265+3/5. Or en décimal 3/5=0.6 mais en binaire 3/5=0.100110011001... avec une infinité de 1001 qui se suivent. Donc peu importe la précision que tu utiliseras, un calcul de 3/5 en binaire ne pourra jamais être exact.
C'est comme 1/3=0.333333... en décimal. On a 0.333333*3 = 0.999999 au lieu de 1

Si tu veux faire des calculs plus précis tu devrais utiliser le type double au lieu des float ou passer sur la classe BigDecimal de Java :
http://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html

System.out.println(256.6f * 3); // float: 769.80005
System.out.println(256.6d * 3); // double: 769.8000000000001
System.out.println(new BigDecimal("265.6").multiply(BigDecimal.valueOf(3))); // BigDecimal: 796.8
Nicoolasens
Messages postés
5
Date d'inscription
lundi 21 mars 2016
Statut
Membre
Dernière intervention
13 septembre 2016
1 -
Très intéressant ! Merci bien !
0
Merci
on pourai avoir un exemple d'utilisation car je voi pas du tout comment ca marche