Comment arrondir un nombre à N décimales en Java

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.

Lectures complémentaires:

Nombre de chiffres dans un entier en Java

Découvrez différentes manières d'obtenir le nombre de chiffres d'un entier en Java.

Read more

Vérifier si un nombre est premier en Java

Apprenez à vérifier la primalité du nombre à l'aide de Java.

Read more

Vérifier si une chaîne est numérique en Java

Explorez différentes façons de déterminer si une chaîne est numérique ou non.

Read more

2. Nombres décimaux en Java

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

double PI = 3.1415;

Cependant, les deux typesshould never be used for precise values, tels que les devises. Pour cela, et aussi pour arrondir, nous pouvons utiliser la classeBigDecimal.

3. Formatage d'un nombre décimal

Si nous voulons simplement imprimer un nombre décimal avecnchiffres 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 classeDecimalFormat:

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 queString.format() utilisé ci-dessus.

4. ArrondirDoubles avecBigDecimal

Pour arrondirdoubles àn décimales, nous pouvons écrire unhelper method:

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 deBigDecimal; nous devonsalways use BigDecimal(String) constructor. Cela évite les problèmes de représentation de valeurs inexactes.

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


    org.apache.commons
    commons-math3
    3.5

La dernière version peut être trouvéehere.

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

Precision.round(PI, 3);

Par défaut, il utilise la même méthode d'arrondiHALF_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 le troisième paramètre à la méthode d'arrondi souhaitée.

5. Arrondir les doubles avecDoubleRounder

DoubleRounder est un utilitaire de la bibliothèquedecimal4j. 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éehere) en ajoutant la dépendance auxpom.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. Math.Round() Method

Une autre méthode pour arrondir les nombres consiste à utiliser la méthode Math.Round ().

Dans ce cas, nous pouvons contrôler le nombre de décimalesn en multipliant et en divisant par10^n:

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

This method is not recommended as it’s truncating the value. Dans de nombreux cas, les valeurs sont mal arrondies:

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 listée ici à des fins d'apprentissage uniquement.

7. Conclusion

Dans ce rapide didacticiel, nous avons couvert différentes techniques pour arrondir les nombres aux décimalesn.

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 traitant de ce problème.

Le code utilisé lors de la discussion peut être trouvéover on GitHub.