Java wie runde ich richtig - wo ist der Fehler?
Hallo Leute,
Wenn ich Mathematisch runden würde was wäre dann die Rundung auf 2 Nachkommastellen von der Zahl 319.94499999999994 ?
Mein Problem:
Rundet auf 2 Nachkommastellen
Output: x = 319,94
Rundet auf 3 Nachkommastellen
Output: x = 319,945
Würde ich den Output nochmals runden wäre ich bei 319,95
Schule ist schon lange her aber 319.94499999999994 gerundet auf 2 Nachkommastellen ergibt doch 319,95 ... oder?
Meine Frage:
Wir rechne ich in JAVA Kaufmännisch auf 2 Nachkommastellen bei der Zahl 319.94499999999994
folgendes Rechnet leider auch nicht kaufmännisch:
Wenn ich Mathematisch runden würde was wäre dann die Rundung auf 2 Nachkommastellen von der Zahl 319.94499999999994 ?
Mein Problem:
double x = (Math.round(319.94499999999994 * 100.0) / 100.0);
Output: x = 319,94
double x = (Math.round(319.94499999999994 * 1000.0) / 1000.0);
Output: x = 319,945
Würde ich den Output nochmals runden wäre ich bei 319,95
Schule ist schon lange her aber 319.94499999999994 gerundet auf 2 Nachkommastellen ergibt doch 319,95 ... oder?
Meine Frage:
Wir rechne ich in JAVA Kaufmännisch auf 2 Nachkommastellen bei der Zahl 319.94499999999994
folgendes Rechnet leider auch nicht kaufmännisch:
public static double rounding(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();
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 660629
Url: https://administrator.de/contentid/660629
Ausgedruckt am: 21.11.2024 um 19:11 Uhr
8 Kommentare
Neuester Kommentar
Hi,
Kaufmännisch runden geht so: Rundung
Wenn du auf die 2. Stelle rundest ist nur deine 3. Stelle relevant. Schau dir den Artikel im Wiki bei Rundungsregeln an.
Aus dem und der Beschreibung von math.round bei Java ergibt sich :
Fertig!
vG
PJM
Kaufmännisch runden geht so: Rundung
Wenn du auf die 2. Stelle rundest ist nur deine 3. Stelle relevant. Schau dir den Artikel im Wiki bei Rundungsregeln an.
Aus dem und der Beschreibung von math.round bei Java ergibt sich :
double x = (Math.round(319.94499999999994 * 100.0) / 100.0);
Fertig!
vG
PJM
Nein, Runden geschieht nicht rekursiv.
Du schaust dir die erste Ziffer von links an, die durch Rundung wegfällt (und nur die) und nur die ist ausschlaggebend.
Du rundest nicht von rechts Ziffer für Ziffer, es ist nur die erste überzählige Nachkommastelle interessant.
Da steht hier eine 4, also wird nicht aufgerundet.
Java rechnet also genau richtig.
Wenn in deinem Matheheft 319,95 rauskommt, ist das falsch
Du schaust dir die erste Ziffer von links an, die durch Rundung wegfällt (und nur die) und nur die ist ausschlaggebend.
Du rundest nicht von rechts Ziffer für Ziffer, es ist nur die erste überzählige Nachkommastelle interessant.
Da steht hier eine 4, also wird nicht aufgerundet.
Java rechnet also genau richtig.
Wenn in deinem Matheheft 319,95 rauskommt, ist das falsch
Nein
Gruß
PJM
Liege ich hier falsch?
Jaso steht es doch oder?
Nein, siehe bereits oben verlinkten Wiki Artikel.Gruß
PJM
Moin,
hast du das Problem verstanden? Versuch mal zu ergründen warum das ein bekanntes Problem ist, also warum es genau passiert. (Binärwert und Fließkomma wert, Diskussion hier) mit dieser Erkenntnis und deinem Wissen wie viele Stellen nach dem Komma deine Datenbank den Fließkomma wert speichert, kannst du dein Problem lösen.
Gruß
PJM
hast du das Problem verstanden? Versuch mal zu ergründen warum das ein bekanntes Problem ist, also warum es genau passiert. (Binärwert und Fließkomma wert, Diskussion hier) mit dieser Erkenntnis und deinem Wissen wie viele Stellen nach dem Komma deine Datenbank den Fließkomma wert speichert, kannst du dein Problem lösen.
Gruß
PJM
Hallo samet22,
da kann ich nur raten, eine sinnvolle Programmiersprache zu verwenden (und entweder eine andere Datenbank oder ein anderes Datenformat). Wenn du kaufmännisch rechnen willst, ist Double so gut wie unbrauchbar. Mit Bigdecimal kannst du in Java sicher einiges erreichen, aber ich würde (angelehnt an meinen Namen) so etwas wie Cobol empfehlen.
Gruß vom
WinCobold
da kann ich nur raten, eine sinnvolle Programmiersprache zu verwenden (und entweder eine andere Datenbank oder ein anderes Datenformat). Wenn du kaufmännisch rechnen willst, ist Double so gut wie unbrauchbar. Mit Bigdecimal kannst du in Java sicher einiges erreichen, aber ich würde (angelehnt an meinen Namen) so etwas wie Cobol empfehlen.
Gruß vom
WinCobold
Zitat von @WinCobold:
Hallo samet22,
da kann ich nur raten, eine sinnvolle Programmiersprache zu verwenden (und entweder eine andere Datenbank oder ein anderes Datenformat).
Programmiersprachen Bashing hilft dem TO nicht weiter. Auch wenn JAVA nicht das gelbe vom Ei ist was Performance angeht, so ist sie doch eine vollwertige Programmiersprache.Hallo samet22,
da kann ich nur raten, eine sinnvolle Programmiersprache zu verwenden (und entweder eine andere Datenbank oder ein anderes Datenformat).
Wenn du kaufmännisch rechnen willst, ist Double so gut wie unbrauchbar. Mit Bigdecimal kannst du in Java sicher einiges erreichen, aber ich würde (angelehnt an meinen Namen) so etwas wie Cobol empfehlen.
Und dann? Dann lernt er wahnsinnig aufwändig eine "neue" (in ganz großen Anführungszeichen) Programmiersprache um dann festzustellen das er bei seinem spezifischen Problem immer noch das falsche Ergebnis raus bekommt. Das ist kein Problem von JAVA. Wen es wirklich interessiert hier der mehr als ausführliche Artikel zum eigentlichen Problem.
Er muss sein Problem Verstehen und in seiner spezifischen Umgebung eine Lösung dafür finden. Hilfestellungen dazu gibt's genug, vorgekaut wird aber nicht.
Gruß vom
WinCobold
Gruß vomWinCobold
FISI