web-dev-qa-db-fra.com

Séparer les doubles en parties entières et décimales

J'essaie de séparer un double dans les parties entières et décimales

Ainsi, par exemple, le nombre 24.4 devrait être séparé en 24 et 4.

int integer = (int)number;
double decimal = number-(int)number;
System.out.println(decimal); 

L'utilisation de cette méthode me donne les valeurs suivantes:

integer = 24
decimal = 0.3999999999999986

J'ai besoin que la valeur de décimale soit 4.

Comment ce problème peut-il être résolu?

12
Ashish Agarwal

Vous pouvez faire un String split(...) . Et ensuite Integer parseInt(...) pour récupérer les deux composants entiers.

10
Oh Chin Boon

En fonction du nombre de chiffres décimaux, vous pouvez utiliser cette méthode:

double number = 24.4;

int integer = (int)number;
double decimal = (10 * number - 10 * integer)/10;

System.out.println(decimal); 

Explication : Supprimez les points décimaux, effectuez la soustraction et ramenez enfin le point décimal à son emplacement d'origine!

5
RGO

Ceci parce que doubles ne sont pas exactement des "nombres réels" - rappelez-vous qu'il existe un nombre infini de nombres réels dans n'importe quelle plage, alors qu'il n'y a qu'un nombre fini de chiffres dans double - donc un nombre fini de valeurs, ainsi des arrondis doivent se produire.

Le fait est que 24.4 ne peut pas être exactement représenté par double - la fraction de votre nombre est donc d’environ 0,3999 ....
Si vous voulez une solution exacte, vous devez utiliser une bibliothèque qui vous donne des valeurs exactes pour les nombres décimaux, telles que BigDecimal .

Si vous voulez en savoir plus sur le fait que doubles n'est pas exact - vous devriez en savoir plus sur arithmétique à virgule flottante , et cet article , bien que de haut niveau, il est également indispensable de bien comprendre ce qui est passe.

Si vous ne comprenez pas encore ces articles, tenez compte des éléments suivants: Si vous avez besoin d'une valeur exacte - doubles ne peut pas la fournir -, vous devez utiliser une bibliothèque si tel est le cas.

5
amit
float number = (float) 22.45;
int integer = (int)number;
double decimal = number-integer;
System.out.println(integer + "decimal" + decimal); 
1
user3291532
double number = 20.57;
Double.valueOf(String.valueOf(number)).intValue()
1
Belov Vladimir

! [Voici ma solution] [1]

voici ma solution. J'ai utilisé une méthode simple en programmation C pour scinder les nombres fractionnaires en deux entiers différents ... Voici le code

#include<stdio.h>
void main()
{
float x=24.56; int y=(int)x; float z=(x-y)*1000000000; int zd=(int)z;
printf("%lf",x);
printf("\ninteger Part %d\n",y);
printf("\nDecimal Part %d\n",zd);
}

Sortie


24.559999 Entier Partie 24

Partie décimale 559999488

1
Sameer

Voici une petite méthode que j'ai écrite pour accomplir ceci:

/**
 * 
 * @param n
 * @return 
 */
private static double getFractionalPart(double n) {     
    if (n > 0) {
        return n - Math.floor(n);
    } else {
        return ((n - Math.ceil(n)) * -1);
    }
}
1
Robert Eksten

Comme RGO l'a déclaré, vous pouvez le faire et aussi arrondir le nombre décimal afin d'obtenir la valeur appropriée. Ex:

double number = 20.57;

int integer = (int)number;
double decimal = (10 * number - 10 * integer)/10;
double temp =  Math.round(decimal*100.0)/100.0;
System.out.println("Int = " + integer + "\nDecimal = " + temp);
0
Alfaza

Commencez par trouver le nombre, les chiffres après la virgule, et multipliez ce nombre par 10. par exemple: x = 26.78621 puis multipliez par 100000 [ici vous ne pouvez pas multiplier comme x * 10, encore x * 10 et ainsi de suite (5 fois), la première fois que vous multipliez par 10, vous obtiendrez 267.862199999 ..] Après multiplication soustrayez 2600000 du résultat. voici un lien de votre réponse que j'ai code il. https://stackoverflow.com/a/18517555/2508414

0
OnePunchMan

Tu peux le faire:

(val - val.longValue()) * 100

utilisez 1000 pour obtenir 3 fractions:

par exemple:

(1.2445 - 1) * 100 = 0.244
0
nimo23