Runden eines doubles auf n nachkommastellen

Sklo

Mitglied
Ich wollte fragen wie ich einen double wert auf n nachkommastellen runden kann z.B.

1,4145 -> 1,415 od. 3,6 ->3,60

Mit der methode round in Math kann ich nichts anfangen und meines wisses gibt es auch keine methode zum runden wo man die nachkommastellen angeben kann?
Ich hoffe ihr könnt mir helfen,
mfg Sklo
 
Warum kannst du mit round nichts anfangen?🙂
Wenn du z.B. aus 1.4145 -> 1.415 machen willst geht das so:

Java:
x = Math.round(x*1000)/1000.0;

Du musst dir das halt vorstellen. Du hast also 1.4145 * 1000 = 1414.5, das wird gerundet auf 1415. Das teilst du durch 1000 = 1.415.. Wenn du nur 2 Nachkommastellen haben willst nimmst du dann halt z.B. 100 statt 1000.

lg
 
...
Java:
x = Math.round(x*1000)/1000.0;
...

Was allerdings auch schon hinter dem Link zu erfahren war. ;-)



Wenn Du allerdings die ungerundeten Werte behalten möchtest und
die Rundung nur für eine formatierte Ausgabe brauchst, geht auch folgendes:

Java:
...
    public static void main(String[] args) {
        
        double a = 1.4145;
        double b = 3.6;
        gerundeteAusgabe(a, 3);
        gerundeteAusgabe(b, 2);
   
    }   
    
    static void gerundeteAusgabe(double wert, int stellen) {
        StringBuilder sb = new StringBuilder(",##0.");
        for (int i=0; i<stellen; i++)
            sb.append("0");
        DecimalFormat df = new DecimalFormat(sb.toString());
        df.setRoundingMode(RoundingMode.HALF_UP);
        System.out.println(df.format(wert));
    }
...


Runden mit variablen Nachkommastellen geht z.B. auch...

Java:
...

/*
...so:
*/
    static double myRound(double wert, int stellen) {
        return  Math.round(wert * Math.pow(10, stellen)) / Math.pow(10, stellen);
    }
/*
...oder so:
*/    
    static double myRound2(double wert, int stellen) {
        BigDecimal b = new BigDecimal(wert);
        return  b.setScale(stellen,BigDecimal.ROUND_HALF_UP).doubleValue();        
    }
...

VG ROlf
 
es geht auch ohne Math

public static double runden(double Wert, int NKStellen) {
// auf Anzahl Nachkommastellen NKStellen runden (ohne Math library)
// NKStellen integer >= 0
// Ausgabe unverändert bei NKStellen < 0
double Zehner = 1; // Zehnerpotenz aufbauen, lokale Var

if (NKStellen < 0) { // Ausgabe unverändert
return (Wert);

} else if (NKStellen >= 1) { // Zehnerpotenz aufbauen
for (int loop = 1; loop <= NKStellen; loop ++) {
Zehner *= 10;
}
}
// NKStellen = 0 -> abschneiden
Wert = Wert * Zehner + 0.5; // auf Anzahl Nachkommastellen runden
Wert = (int) Wert;
return (Wert / Zehner);
}
 
Runden auf exakte Nachkommastellen mit einem float oder double klingt danach als haette man gerne einen exakten Wert, und das spielt sich mit Gleitkommazahlen einfach nicht. Gar nicht.

Wenn man einen exakten Wert will, um mit diesem zu arbeiten, sollte man BigDecimal einsetzen. Fuer Grafik und aehnliches ist es allerdings unerheblich, aber wenn man mit Geld arbeitet sollte man immer BigDecimal verwenden weil man ansonsten in viele kleine Rundungsfehler laeuft, und so etwas einer Buchhaltung (im besten Fall die im eigenen Haus, im schlechtesten Fall die von einer pruefenden Stelle) zu erklaeren birgt immer groeszere Gefahren als nur Kopfschmerzen bei allen Beteiligten.

Also man kann einen float/double auf eine bestimmte Anzahl Nachkommastellen runden, aber das ist ein wenig "hit and miss" und wahrscheinlich will man einen anderen Datentypen verwenden.
 
Der ursprüngliche Beitrag war schon über 10 Jahre alt. Vermutlich wird der TE das Problem inzwischen gelöst haben. 🙂
 
Der ursprüngliche Beitrag war schon über 10 Jahre alt. Vermutlich wird der TE das Problem inzwischen gelöst haben. 🙂
Wenn man noch etwas zum Thema beizutragen hat kann man ha was dazu schreiben, egal wie alt es ist. Auch die alten Themen tauchen ja schlieszlich in Suchen auf und sind nicht begrenzt auf die urspruenglichen Beteiligten.
 
Danke für den Hinweis auf das Alter des posts.
Ich bin neu hier im Forum und auch erst seit ein paar Tagen in Java unterwegs. Deshalb habe ich die Frage hier nachgestellt und wollte meine Tips an die Welt posten, denn man gelangt ja auch in alten Beiträgen auf eine (mehr oder weniger schlaue) Lösung 🙂
Genau so bin ich hier gelandet, auf der Suche nach RUNDEN
Andy
 
Herlich willkommen im Forum Andy.

Das mit dem Alter des Therads ist nichts wildes - das übersieht man halt mal gerne leicht.

Für Dich nur ein kleiner Hinweis: Wenn Du Code postest, dann nutze bitte Code-Tags bzw. einfach den Knopf </> links oberhalb des Eingabebereiches. Dann behält er seine Formatierung und ist besser lesbar (und mache Dinge werden nicht als Formatierungsanweisung verstanden wie z.B. ein [i] - welches die kursive Schreibweise startet.
 

Zurück
Oben