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

1. Vue d’ensemble

Dans ce didacticiel, nous allons explorer différentes méthodes pour séparer les parties entière et décimale des types à virgule flottante en Java, à savoir float et double .

2. Problèmes liés aux types à points flottants

Commençons par examiner une fraction simple et une manière naïve de réaliser la séparation, par moulage:

double doubleNumber = 24.04;
int intPart = (int) doubleNumber;
System.out.println("Double Number: " + doubleNumber);
System.out.println("Integer Part: " + intPart);
System.out.println("Decimal Part: " + (doubleNumber - intPart));

Lorsque nous essayons d’exécuter le code ci-dessus, voici ce que nous obtenons:

Double Number: 24.04
Integer Part: 24
Decimal Part: 0.03999999999999915

Contrairement à nos attentes, la sortie n’imprime pas correctement la partie décimale. Par conséquent, les nombres à virgule flottante ne conviennent pas aux calculs où les erreurs d’arrondi ne peuvent être tolérées.

3. Première approche: Fractionner le String

Commençons par convertir le nombre décimal en équivalent String .

Ensuite, nous pouvons diviser le String à l’index du point décimal.

Voyons cela avec un exemple:

double doubleNumber = 24.04;
String doubleAsString = String.valueOf(doubleNumber);
int indexOfDecimal = doubleAsString.indexOf(".");
System.out.println("Double Number: " + doubleNumber);
System.out.println("Integer Part: " + doubleAsString.substring(0, indexOfDecimal));
System.out.println("Decimal Part: " + doubleAsString.substring(indexOfDecimal));

La sortie du code ci-dessus est:

Double Number: 24.04
Integer Part: 24
Decimal Part: .04

La sortie est exactement ce que nous attendons. Mais le problème ici est la limitation de l’utilisation de String - ce qui signifie que nous ne pourrons plus effectuer aucune autre opération arithmétique.

4. Deuxième approche: Utiliser BigDecimal

La classe BigDecimal en Java permet à l’utilisateur de contrôler totalement le comportement des arrondis.

Cette classe fournit également des opérations d’arithmétique, de manipulation d’échelle, d’arrondissement, de comparaison, de hachage et de conversion de format.

Utilisons BigDecimal pour obtenir les parties entières et décimales d’un nombre à virgule flottante:

double doubleNumber = 24.04;
BigDecimal bigDecimal = new BigDecimal(String.valueOf(doubleNumber));
int intValue = bigDecimal.intValue();
System.out.println("Double Number: " + bigDecimal.toPlainString());
System.out.println("Integer Part: " + intValue);
System.out.println("Decimal Part: " + bigDecimal.subtract(
  new BigDecimal(intValue)).toPlainString());

La sortie sera:

Double Number: 24.04
Integer Part: 24
Decimal Part: 0.04

Comme nous pouvons le voir ci-dessus, le résultat est conforme aux attentes. Nous pouvons également effectuer des opérations arithmétiques à l’aide des méthodes fournies dans BigDecimal class.

5. Conclusion

Dans cet article, nous avons présenté diverses méthodes permettant de séparer les parties entières et décimales des types à virgule flottante. Nous avons également discuté des avantages de l’utilisation de BigDecimal pour les calculs en virgule flottante.

En outre, notre tutoriel détaillé sur BigDecimal et BigInteger en Java décrit davantage de caractéristiques et de scénarios d’utilisation des deux classes.

Enfin, le code source complet de ce tutoriel est available sur GitHub.