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.
Vérifier si un nombre est premier en Java
Apprenez à vérifier la primalité du nombre à l'aide de Java.
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.
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.