Aroondir un nombre à virgule

joebar3333 Messages postés 41 Date d'inscription dimanche 24 octobre 2004 Statut Membre Dernière intervention 29 juin 2005 - 6 mai 2005 à 11:34
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 - 10 mai 2005 à 14:45
Salut,

cette question fait suie à mon récent post sur des problèmes de pertes de précision sur un nombre à virgule http://www.javafr.com/forum.v2.aspx?ID=450156

voila donc j'aimerai savoir comment arrondir un nombre à 0.1 le plus proche.

Par exemple :
8.4000001 s'arrondit à 8.4
comme 8.39999 s'arrondit à 8.4
J'ai essayé le numberFormat, mais j'ai pas réussi à le faire fonctionner.

Merci encore.

5 réponses

cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
6 mai 2005 à 12:54
Salut

Il n'y aura que NumberFormat qui pourra te faire ça ...
Lit bien la javadoc sur le sujet (tape 'NumberFormat java' dans google) ...

@+
0
joebar3333 Messages postés 41 Date d'inscription dimanche 24 octobre 2004 Statut Membre Dernière intervention 29 juin 2005
6 mai 2005 à 14:31
Salut,

Merci d'avoir répondu, mais pourrais-tu me donner un exemple simple stp ? Ca me ferait gagner pas mal de temps, après je pourrai l'adapter à mes besoins.

Je te remercie d'avance.
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
8 mai 2005 à 15:54
0
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
10 mai 2005 à 14:43
Salut



la première méthode est d'utiliser Math.round



par exemple :

double nombre = 8.4f; // c'est le nombre à arrondir

System.out.println(nombre);

System.out.println(Math.round(nombre*10)/10.);



retourne :

8.399999618530273

8.4



MAIS (!) le problème, comme dit dans ta question précédente, est
que tu n'es pas assuré d'avoir un résultat parfait, il peut rester des
imprécisions.

J'avais déjà eu ce problème en travaillant sur des nombres très petits, pour un traceur de fractals fait pour le fun :)

les arrondis étaient vraiment dégueux... (pour info, comme
j'utilisais une DLL en C pour les calculs, j'avais rajouté les arrondis
dans la DLL, en toute finesse et délicatesse :D :D)



Avec NumberFormat, tu es assuré d'avoir un arrondi parfait, mais
par contre, tu te retrouves avec une chaîne de caractères :-|



ça donne :

NumberFormat nf = NumberFormat.getInstance();

nf.setMaximumFractionDigits(1);

System.out.println(Double.toString(nombre)+" -> "+nf.format(nombre));



qui retourne :

8.399999618530273 -> 8,4



Enfin, il est peut-être possible d'utiliser BigDecimal si le
problème de précision est crucial, mais je n'ai pas le temps de
regarder maintenant



Salut !

Dobel
[Une fois rien, c'est rien; deux
fois rien, ce n'est pas beaucoup, mais pour trois fois rien, on peut
déjà s'acheter quelque chose, et pour pas cher]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
10 mai 2005 à 14:45
et un petit conseil aussi :)



si tu n'as pas d'impératifs de mémoire, essaie d'effectuer au maximum
tes calculs avec des doubles, en ne convertissant en float que quand
c'est nécessaire. Ca améliorera la précision, et il me semble qu'il n'y
a même pas de différence au niveau du temps d'exécution.

Dobel
[Une
fois rien, c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour
trois fois rien, on peut déjà s'acheter quelque chose, et pour pas cher]
0
Rejoignez-nous