J'essaie d'arrondir les valeurs doubles à 2 chiffres décimaux, mais cela ne fonctionne pas dans tous les scénarios
public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.doubleValue();
}
public static void main(String[] args) {
System.out.println(round(25.0,2)); //25.0 - expected 25.00
System.out.println(round(25.00d,2)); //25.0 - expected 25.00
System.out.println(round(25,2)); //25.0 - expected 25.00
System.out.println(round(25.666,2)); //25.67
}
En bref, que la décimale existe ou non, maintenez toujours les valeurs jusqu'à 2 décimales même si elle doit ajouter des zéros supplémentaires.
Toute aide est appréciée!
Il y a deux choses qui peuvent être améliorées dans votre code.
Tout d'abord, lancer un double sur BigDecimal afin de l'arrondir est une approche très inefficace. Vous devriez utiliser Math.round à la place:
double value = 1.125879D;
double valueRounded = Math.round(value * 100D) / 100D;
Deuxièmement, lorsque vous imprimez ou convertissez un nombre réel en chaîne, vous pouvez envisager d'utiliser System.out.printf ou String.format. Dans votre cas, l'utilisation du format "% .2f" fait l'affaire.
System.out.printf("%.2f", valueRounded);
J'utilise la fonction format () de la classe String. Code beaucoup plus simple. Le 2 dans "% .2f" indique le nombre de chiffres après le point décimal que vous souhaitez afficher. Le f dans "% .2f" indique que vous imprimez un nombre à virgule flottante. Voici la documentation sur le formatage d'une chaîne ( http://docs.Oracle.com/javase/7/docs/api/Java/util/Formatter.html#syntax )
double number = 12.34567;
System.out.println(String.format("%.2f", number));
Cela fonctionnera pour vous:
public static void main(String[] args) {
DecimalFormat two = new DecimalFormat("0.00"); //Make new decimal format
System.out.println(two.format(25.0));
System.out.println(two.format(25.00d));
System.out.println(two.format(25));
System.out.println(two.format(25.666));
}
Vous reconvertissez BigDecimal
en double
qui coupe essentiellement les zéros de fin.
Vous pouvez renvoyer BigDecimal
ou BigDecimal.toPlainString()
.
public static String round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.toPlainString();
}