Rechnen mit Rundungsfehlern

Duckemai

Mitglied
Hallo zusammen,

ich versuche derzeit eine relativ simple Rechenfunktion einzubauen.
Aber das Ergebnis ist katastrophal.

Beispiel:
Es soll einfach nur 5.6 mit 3 multipliziert werden.
Das sieht dann so aus:

ausgabe.setText(String.valueOf((5.6*3)));

Mit dem völlig falschen Ergebnis: 16.79999999 anstatt 16.8.

OK, ein Rundungsfehler, den ich mit:
x = Math.round( erg * 10.0 ) / 10.0;
beheben könnte. Aber es soll ja nicht immer gerundet werden!! Denn bei zB
5.7*3.1 bekomme ich das richtige Ergebnis von 17,67 mit 2 Nachkommastellen.

Wie kann ich es einrichten, dass nur gerundet wird, wenn das
Ergebnis nicht richtig ist. Kennt jemand eine passende Methode?

Vielen Dank
Duckemai
 
Tja, das liegt leider an der Natur der Gleitkommazahlen, da kann man wenig gegen machen, wenn man keinen Vergleichswert hat. Du könntest dir höchstens mal die Klasse java.math.BigDecimal anschauen und gucken, ob du damit weiter kommst.
 
Hallo,

Java:
double a = 5.6;
double b = 3;
double c = BigDecimal.valueOf(a).multiply(BigDecimal.valueOf(b)).doubleValue();
System.out.println(c);

Ausgabe:
Code:
16.8
ist schrecklich... ist aber so...

Gruß Tom
 
Hallo,

das macht einen guten Eindruck.
Das Runden scheint mir bei diesen Funktionen aber etwas hackelig zu sein.
z.B: BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3),RoundingMode).doubleValue()
Die Ausgabe 0.666666 fehlt mir da.
Ich habe es mit round() gelöst.

Danke
Duckemai
 
Das Runden scheint mir bei diesen Funktionen aber etwas hackelig zu sein.
z.B: BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3),RoundingMode).doubleValue()
Die Ausgabe 0.666666 fehlt mir da.
Probier es mal so:
Java:
// Rundung auf 6 Nachkommastellen:
String s = BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3), 6, RoundingMode.DOWN).toPlainString();
System.out.println(s);
Wenn du nur an einer Stringdarstellung des Ergebnisses interessiert bist, würde ich gleich wie oben toPlainString() o.ä. verwenden, anstatt erst in einen Double zu konvertieren.

Grüße,
Matthias
 
Zurück