2014-09-22 11 views
6

Ich versuche, die doppelten Werte auf zwei Dezimalstellen abzurunden, aber es ist nicht in allen Szenarien arbeitetJava Doppel Runde auf 2 Komma immer

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 
} 

Kurz gesagt, egal ob dezimal vorhanden ist oder nicht, Halten Sie die Werte immer auf 2 Dezimalstellen, auch wenn zusätzliche Nullen aufgefüllt werden müssen.

Jede Hilfe ist willkommen!

+3

Möglicherweise müssen Sie anstelle von setScale das Dezimalformat verwenden. –

Antwort

11

Es gibt zwei Dinge, die in Ihrem Code verbessert werden kann.

Erstens, Gießen Doppel auf BigDecimal, um es zu runden ist sehr ineffizient Ansatz. Sie sollten Math.round statt:

double value = 1.125879D; 
    double valueRounded = Math.round(value * 100D)/100D; 

Zweitens, wenn Sie reelle Zahl zu String drucken oder konvertieren, können Sie prüfen, System.out.printf oder String.format verwenden. In Ihrem Fall funktioniert das Format "% .2f".

System.out.printf("%.2f", valueRounded); 
+1

"Erster" Teil ist nur notwendig, wenn Sie gerundeten Wert als doppelt erhalten müssen. Das Formatieren mit Präzision führt auch zu einer ordnungsgemäßen Rundung. Wenn das Endziel Ihres Programms also darin besteht, eine Zeichenfolgendarstellung des gerundeten Wertes zu erhalten, brauchen Sie nur 'String.format' oder' System.out.printf'. – Aivean

+0

Das ist jedoch nicht Rundung wie 'RoundingMode.HALF_UP'. In der Tat, das ist keine Rundung, nur Abschneiden. –

+2

@DavidConrad Aus meiner Sicht arbeiten beide Beispiele nach dem Algorithmus RoundingMode.HALF_UP. Darüber hinaus ist String.format [für die Verwendung dieses Algorithmus deklariert] (http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax) (Suche 'runder halber Algorithmus') Stichwort dort). – Aivean

2

Sie konvertieren BigDecimal zurück zu double, die im Wesentlichen die abschließenden Nullen trimmen.

Sie können entweder BigDecimal oder BigDecimal.toPlainString() zurückgeben.

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

Ich verwende die format() - Funktion der String-Klasse. Viel einfacherer Code. Die 2 in "% .2f" gibt die Anzahl der Stellen nach dem Dezimalpunkt an, die Sie anzeigen möchten. Das f in "% .2f" zeigt an, dass Sie eine Fließkommazahl drucken. Hier ist die Dokumentation zur Formatierung einer Zeichenkette (http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax)

double number = 12.34567; 
System.out.println(String.format("%.2f", number)); 
2

Dies wird für Sie arbeiten:

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

}