Comment arrondir un nombre à N décimales en Java

1. Vue d'ensemble

Dans ce court article, nous allons voir comment arrondir un nombre à n décimales en Java.

2. Nombres décimaux en Java

Java fournit deux types primitifs qui peuvent être utilisés pour stocker des nombres décimaux: float et double . Double est le type utilisé par défaut:

double PI = 3.1415;

Cependant, les deux types ne doivent jamais être utilisés pour des valeurs précises , telles que les devises. Pour cela, et aussi pour arrondir, nous pouvons utiliser la classe BigDecimal .

3. Formatage d'un nombre décimal

Si nous voulons simplement imprimer un nombre décimal avec n chiffres après la virgule décimale, nous pouvons simplement formater la chaîne de sortie:

System.out.printf("Value with 3 digits after decimal point %.3f %n", PI); // OUTPUTS: Value with 3 digits after decimal point 3.142

Alternativement, nous pouvons formater la valeur avec la classe DecimalFormat :

DecimalFormat df = new DecimalFormat("###.###"); System.out.println(df.format(PI));

DecimalFormat nous permet de définir explicitement le comportement d'arrondi, donnant plus de contrôle sur la sortie que String.format () utilisé ci-dessus.

4. Arrondir les doubles avec BigDecimal

Pour arrondir les doubles s à n décimales, nous pouvons écrire une méthode d'assistance :

private static double round(double value, int places) { if (places < 0) throw new IllegalArgumentException(); BigDecimal bd = new BigDecimal(Double.toString(value)); bd = bd.setScale(places, RoundingMode.HALF_UP); return bd.doubleValue(); }

Il y a une chose importante à noter dans cette solution - lors de la construction de BigDecimal ; nous devons toujours utiliser BigDecimal (String) constructeur . Cela évite les problèmes de représentation de valeurs inexactes.

Nous pouvons réaliser la même chose en utilisant la bibliothèque Apache Commons Math:

 org.apache.commons commons-math3 3.5 

La dernière version peut être trouvée ici.

Une fois la bibliothèque ajoutée au projet, nous pouvons utiliser la méthode Precision.round () , qui prend deux arguments - valeur et échelle:

Precision.round(PI, 3);

Par défaut, il utilise la même méthode d'arrondi HALF_UP que notre méthode d'assistance. Par conséquent, les résultats devraient être les mêmes.

Notez que nous pouvons changer le comportement d'arrondi en passant la méthode d'arrondi souhaitée comme troisième paramètre.

5. Arrondir les doubles avec DoubleRounder

DoubleRounder est un utilitaire de la bibliothèque decimal4j. Il fournit une méthode rapide et sans déchets pour arrondir les doubles de 0 à 18 décimales.

Nous pouvons obtenir la bibliothèque (la dernière version peut être trouvée ici) en ajoutant la dépendance au pom.xml :

 org.decimal4j decimal4j 1.0.3 

Maintenant, nous pouvons simplement utiliser:

DoubleRounder.round(PI, 3);

Cependant, DoubleRounder échoue dans quelques scénarios, par exemple:

System.out.println(DoubleRounder.round(256.025d, 2)); // OUTPUTS: 256.02 instead of expected 256.03

6. Méthode Math.round ()

Une autre façon d'arrondir les nombres consiste à utiliser la méthode Math.Round ().

Dans ce cas, nous pouvons contrôler n nombre de décimales en multipliant et en divisant par 10 ^ n :

public static double roundAvoid(double value, int places) { double scale = Math.pow(10, places); return Math.round(value * scale) / scale; }

Cette méthode n'est pas recommandée car elle tronque la valeur . Dans de nombreux cas, les valeurs ne sont pas arrondies correctement:

System.out.println(roundAvoid(1000.0d, 17)); // OUTPUTS: 92.23372036854776 !! System.out.println(roundAvoid(260.775d, 2)); // OUTPUTS: 260.77 instead of expected 260.78

Et donc, cette méthode est répertoriée ici à des fins d'apprentissage uniquement.

7. Conclusion

Dans ce tutoriel rapide, nous avons abordé différentes techniques pour arrondir les nombres à n décimales.

Nous pouvons simplement formater la sortie sans changer la valeur, ou nous pouvons arrondir la variable en utilisant une méthode d'assistance. Nous avons également couvert quelques bibliothèques qui traitent de ce problème.

Le code utilisé pendant la discussion se trouve à l'adresse over sur GitHub.