web-dev-qa-db-fra.com

Java Double arrondi à 2 décimales toujours

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!

13
Reddy

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);
17
Aivean

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));
5
DucRP

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));

}
5
Manjunath Maruthi

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();
}
3
RP-