web-dev-qa-db-fra.com

Comment obtenir les nombres après la virgule décimale? (Java)

 double d = 4.321562;

Existe-t-il un moyen simple d'extraire le 0.321562 seul de d? J'ai essayé de chercher dans la classe de mathématiques mais pas de chance. Si cela peut être fait sans conversion en chaîne ou en conversion en autre chose, c'est encore mieux.

23
David

Eh bien, vous pouvez utiliser:

double x = d - Math.floor(d);

Notez qu'en raison du fonctionnement du virgule flottante binaire, cela ne vous donnera pas exactement 0,321562, car la valeur d'origine n'est pas exactement 4,321562. Si vous êtes vraiment intéressé par les chiffres exacts, vous devez utiliser BigDecimal à la place.

30
Jon Skeet

Une autre façon d'obtenir la fraction sans utiliser Math est de lancer un long.

double x = d - (long) d;

Lorsque vous imprimez un double le toString effectuera une petite quantité d'arrondi afin que vous ne voyiez aucune erreur d'arrondi. Cependant, lorsque vous supprimez la partie entière, l'arrondi ne suffit plus et l'erreur d'arrondi devient évidente.

La solution consiste à effectuer l'arrondi vous-même ou à utiliser BigDecimal qui vous permet de contrôler l'arrondi.

double d = 4.321562;
System.out.println("Double value from toString " + d);
System.out.println("Exact representation " + new BigDecimal(d));
double x = d - (long) d;
System.out.println("Fraction from toString " + x);
System.out.println("Exact value of fraction " + new BigDecimal(x));
System.out.printf("Rounded to 6 places %.6f%n", x);
double x2 = Math.round(x * 1e9) / 1e9;
System.out.println("After rounding to 9 places toString " + x2);
System.out.println("After rounding to 9 places, exact value " + new BigDecimal(x2));

impressions

Double value from toString 4.321562
Exact representation 4.321562000000000125510268844664096832275390625
Fraction from toString 0.3215620000000001
Exact value of fraction 0.321562000000000125510268844664096832275390625
Rounded to 6 places 0.321562
After rounding to 9 places toString 0.321562
After rounding to 9 places, exact value 0.32156200000000001448796638214844278991222381591796875
27
Peter Lawrey

Utilisez modulo:

double d = 3.123 % 1;
assertEquals(0.123, d,0.000001);
9
Cedric Reichenbach