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
?
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
je pense que ce serait le moyen le plus simple :
float n = 22.65f;
float x = n - (int) n;