Comment obtenir les chiffres après la virgule? (java) [en double]

cette question a déjà une réponse ici:

  • Comment obtenir des parties entières et fractionnaires de double en JSP / Java? 17 réponses
 double d = 4.321562;

y a-t-il un moyen facile d'extraire le 0.321562 tout seul de d? J'ai essayé de regarder dans le cours de maths mais pas de chance. Si cela peut être fait sans conversion en chaîne ou moulage à autre chose, encore mieux.

23
demandé sur David 2011-05-29 12:40:43

3 réponses

vous pouvez utiliser:

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

notez qu'en raison de la façon dont la virgule flottante binaire fonctionne, cela ne vous donnera pas exactement 0.321562, car la valeur originale n'est pas exactement 4.321562. Si vous êtes vraiment intéressé par les chiffres exacts, Vous devriez utiliser BigDecimal à la place.

28
répondu Jon Skeet 2011-05-29 08:44:45

une autre façon d'obtenir la fraction sans utiliser les mathématiques est de lancer sur une longue.

double x = d - (long) d;

quand vous imprimez un double le toString effectuera une petite quantité d'Arrondissement de sorte que vous ne voyez pas d'erreur d'arrondissement. Cependant, lorsque vous supprimez la partie entière, l'arrondissement n'est plus suffisant et l'erreur d'arrondissement devient évidente.

le moyen de contourner cela est de faire l'arrondi vous-même ou utiliser BigDecimal qui vous permet de contrôler le 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));

imprime

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
25
répondu Peter Lawrey 2011-05-29 09:16:41

utiliser modulo:

double d = 3.123 % 1;
assertEquals(0.123, d,0.000001);
7
répondu Cedric Reichenbach 2012-07-30 15:19:33