it-swarm.com.de

Runden Sie ein Doppel auf 2 Dezimalstellen

Wenn der Wert 200.3456 ist, sollte er in 200.34 formatiert werden. Wenn es 200 ist, sollte es 200.00 sein.

430
Rajesh

Hier ist ein Dienstprogramm, das rundet (anstatt ) ein Double auf die angegebene Anzahl von Dezimalstellen abschneidet.

Zum Beispiel:

round(200.3456, 2); // returns 200.35

Originalfassung; Pass damit auf

public static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    long factor = (long) Math.pow(10, places);
    value = value * factor;
    long tmp = Math.round(value);
    return (double) tmp / factor;
}

Dies funktioniert schlecht in Eckfällen mit entweder einer sehr hohen Anzahl von Dezimalstellen (z. B. round(1000.0d, 17)) oder einem großen ganzzahligen Teil (z. B. round(90080070060.1d, 9)). Vielen Dank an Sloin für den Hinweis.

Ich habe das oben genannte verwendet, um "nicht zu große" Verdopplungen jahrelang glücklich auf 2 oder 3 Dezimalstellen abzurunden (zum Beispiel, um die Zeit in Sekunden für Protokollierungszwecke zu bereinigen: 27.987654321987 -> 27.99). Aber ich denke, es ist am besten, es zu vermeiden, da zuverlässigere Methoden zur Verfügung stehen, auch mit saubererem Code.

Verwenden Sie dies stattdessen

(Nach diese Antwort von Louis Wasserman und diese von Sean Owen .)

public static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    BigDecimal bd = BigDecimal.valueOf(value);
    bd = bd.setScale(places, RoundingMode.HALF_UP);
    return bd.doubleValue();
}

Beachten Sie, dass HALF_UP der in der Schule übliche Rundungsmodus ist. Lesen Sie die RoundingMode-Dokumentation , wenn Sie den Verdacht haben, dass Sie etwas anderes benötigen, wie Bankers 'Rounding .

Wenn Sie es vorziehen, können Sie das oben Genannte natürlich in einen Einzeiler einbetten:
new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue()

Und auf jeden Fall

Denken Sie immer daran, dass Gleitkommadarstellungen mit float und double ungenau sind . Betrachten Sie beispielsweise die folgenden Ausdrücke:

999199.1231231235 == 999199.1231231236 // true
1.03 - 0.41 // 0.6200000000000001

m genau zu sein, möchten Sie BigDecimal verwenden. Verwenden Sie dabei den Konstruktor, der einen String akzeptiert, niemals den Konstruktor, der double akzeptiert. Führen Sie beispielsweise Folgendes aus:

System.out.println(new BigDecimal(1.03).subtract(new BigDecimal(0.41)));
System.out.println(new BigDecimal("1.03").subtract(new BigDecimal("0.41")));

Einige ausgezeichnete weiterführende Literatur zum Thema:


Wenn Sie möchten, dass Zeichenfolgen anstelle von (oder zusätzlich zu) strikt gerundeten Zahlen formatiert werden , lesen Sie die anderen Antworten.

Beachten Sie insbesondere, dass round(200, 0)200.0 zurückgibt. Wenn Sie " 200.00 " ausgeben möchten, sollten Sie zuerst das Ergebnis für die Ausgabe runden und dann formatieren (was in Jespers Antwort) perfekt erklärt wird ).

744
Jonik

Wenn Sie nur ein double mit zwei Nachkommastellen drucken möchten, verwenden Sie Folgendes:

double value = 200.3456;
System.out.printf("Value: %.2f", value);

Wenn Sie möchten, dass das Ergebnis in einem String angezeigt wird, anstatt es an die Konsole zu senden, verwenden Sie String.format() mit denselben Argumenten:

String result = String.format("%.2f", value);

Oder benutze die Klasse DecimalFormat:

DecimalFormat df = new DecimalFormat("####0.00");
System.out.println("Value: " + df.format(value));
307
Jesper

Ich denke das ist einfacher:

double time = 200.3456;
DecimalFormat df = new DecimalFormat("#.##");      
time = Double.valueOf(df.format(time));

System.out.println(time); // 200.35

Beachten Sie, dass dies tatsächlich die Rundung und nicht nur die Formatierung für Sie erledigt.

114
Santiago

Am einfachsten wäre es, einen solchen Trick zu machen.

double val = ....;
val = val*100;
val = Math.round(val);
val = val /100;

wenn val bei 200.3456 beginnt, wird es auf 20034.56 gerundet und dann auf 20035 geteilt, um 200.34 zu erhalten.

wenn Sie immer abrunden wollten, konnten wir immer abschneiden, indem wir auf ein int wirkten:

double val = ....;
val = val*100;
val = (double)((int) val);
val = val /100;

Diese Technik funktioniert in den meisten Fällen, da sie bei sehr großen Doppelwerten (positiv oder negativ) überlaufen kann. Wenn Sie jedoch wissen, dass Ihre Werte in einem angemessenen Bereich liegen, sollte dies für Sie funktionieren.

67
luke

Bitte benutze Apache commons math :

Precision.round(10.4567, 2)
48
Pritesh Mhatre
function Double round2(Double val) {
    return new BigDecimal(val.toString()).setScale(2,RoundingMode.HALF_UP).doubleValue();
}

Beachte den toString () !!!!

Dies liegt daran, dass BigDecimal die exakte binäre Form des Doppelten konvertiert !!!

Dies sind die verschiedenen vorgeschlagenen Methoden und ihre Fehlerfälle.

// Always Good!
new BigDecimal(val.toString()).setScale(2,RoundingMode.HALF_UP).doubleValue() 

Double val = 260.775d; //EXPECTED 260.78
260.77 - WRONG - new BigDecimal(val).setScale(2,RoundingMode.HALF_UP).doubleValue()

Double val = 260.775d; //EXPECTED 260.78
260.77 - TRY AGAIN - Math.round(val * 100.d) / 100.0d  

Double val = 256.025d; //EXPECTED 256.03d
256.02 - OOPS - new DecimalFormat("0.00").format(val) 
// By default use half even, works if you change mode to half_up 

Double val = 256.025d; //EXPECTED 256.03d
256.02 - FAIL - (int)(val * 100 + 0.5) / 100.0;
33
Luca Vix
double value= 200.3456;
DecimalFormat df = new DecimalFormat("0.00");      
System.out.println(df.format(value));
23
double d = 28786.079999999998;
String str = String.format("%1.2f", d);
d = Double.valueOf(str);
16
user1692711

Wenn Sie wirklich dasselbe Double wollen, aber auf die gewünschte Weise gerundet, können Sie zum Beispiel BigDecimal verwenden

new BigDecimal(myValue).setScale(2, RoundingMode.HALF_UP).doubleValue();
13
daoway

Ein Double abzurunden ist normalerweise nicht das, was man will. Verwenden Sie stattdessen String.format() , um es im gewünschten Format darzustellen.

Für zwei gerundete Stellen. Sehr einfach und Sie aktualisieren im Grunde die Variable, anstatt nur die Zwecke anzuzeigen, die DecimalFormat ausführt.

x = Math.floor(x * 100) / 100;

7

In Ihrer Frage scheint es, dass Sie die Rundung der Zahlen auch vermeiden möchten? Ich denke .format () rundet die Zahlen mit half-up, afaik?
Wenn Sie also runden möchten, sollte 200.3456 200.35 für eine Genauigkeit von 2 sein. Wenn Sie in Ihrem Fall nur die ersten 2 wollen und dann den Rest wegwerfen?

Sie können es mit 100 multiplizieren und dann auf ein int (oder das Wort der Zahl) umwandeln, bevor Sie erneut durch 100 dividieren.

200.3456 * 100 = 20034.56;  
(int) 20034.56 = 20034;  
20034/100.0 = 200.34;

Möglicherweise haben Sie jedoch Probleme mit wirklich sehr großen Zahlen in der Nähe der Grenze. In diesem Fall würde die Konvertierung in einen String und eine Teilzeichenfolge genauso einfach funktionieren.

0
bryanallott
value = (int)(value * 100 + 0.5) / 100.0;
0
user2068610