Comment obtenir la partie décimale d'un flotteur?

j'ai besoin d'extraire la partie décimale d'un nombre à virgule, mais j'obtiens des résultats étranges:

float n = 22.65f;
// I want x = 0.65f, but...

x = n % 1; // x = 0.6499996

x = n - Math.floor(n); // x = 0.6499996185302734

x = n - (int)n; // x = 0.6499996

Pourquoi cela? Pourquoi j'obtiens ces valeurs au lieu de 0.65?

40
demandé sur Cristian 2011-02-16 16:34:02

10 réponses

float n'a que quelques chiffres de précision donc vous devriez vous attendre à voir une erreur ronde assez facilement. essayez double cette méthode est plus précise, mais comporte quand même des erreurs d'arrondissement. Vous devez arrondir toutes les réponses que vous obtenez d'avoir une sortie saine.

si cela n'est pas désirable, vous pouvez utiliser BigDecimal qui n'a pas d'erreurs d'arrondissement, mais a ses propres maux de tête IMHO.

EDIT: Vous pouvez trouver cela intéressant. La valeur par défaut du Flotteur.toString () utilise un arrondi minimal, mais souvent ce n'est pas le cas assez.

System.out.println("With no rounding");
float n = 22.65f;
System.out.println("n= "+new BigDecimal(n));
float expected = 0.65f;
System.out.println("expected= "+new BigDecimal(expected));

System.out.println("n % 1= "+new BigDecimal(n % 1));
System.out.println("n - Math.floor(n) = "+new BigDecimal(n - Math.floor(n)));
System.out.println("n - (int)n= "+new BigDecimal(n - (int)n));

System.out.println("With rounding");
System.out.printf("n %% 1= %.2f%n", n % 1);
System.out.printf("n - Math.floor(n) = %.2f%n", n - Math.floor(n));
System.out.printf("n - (int)n= %.2f%n", n - (int)n);

Imprime

With no rounding
n= 22.6499996185302734375
expected= 0.64999997615814208984375
n % 1= 0.6499996185302734375
n - Math.floor(n) = 0.6499996185302734375
n - (int)n= 0.6499996185302734375
With rounding
n % 1= 0.65
n - Math.floor(n) = 0.65
n - (int)n= 0.65
38
répondu Peter Lawrey 2011-02-16 14:05:10

je pense que ce serait le moyen le plus simple :

float n = 22.65f;
float x = n - (int) n;
16
répondu VinceStyling 2014-07-29 09:45:17

parce que tous les nombres rationnels ne peuvent pas être représentés comme un nombre à virgule flottante et 0.6499996... est l'approximation la plus proche pour 0.65.