• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Rechnen mit JAVA

xplox

Member
Hallo.

Hoffe es weiß jemand weiter!
Ich muss folgendes mit Java berechnen.

double a = 2.11;
double b = 1.91

double erg = a - b;


==> ERGEBNIS IST: 0.19999999996
==> ERGEBNIS SOLLTE ABER SEIN: 0.2

Hab auch schon mit BigDecimal probiert, da kam dann der selbe 'rotz' bei raus!
Ich bin auf ein richtiges Ergebnis angewiesen, da ich leider nicht runden darf!
Es geht hierbei um eine wissenschaftliche Anwendung.

Was kann ich noch ausprobieren???
 
Java ist keine Abkürzung für Javascript.

Hoffe es weiß jemand weiter!
Ich muss folgendes mit Java berechnen.

double a = 2.11;
double b = 1.91

double erg = a - b;


==> ERGEBNIS IST: 0.19999999996
==> ERGEBNIS SOLLTE ABER SEIN: 0.2

Hab auch schon mit BigDecimal probiert, da kam dann der selbe 'rotz' bei raus!
Ich bin auf ein richtiges Ergebnis angewiesen, da ich leider nicht runden darf!
Es geht hierbei um eine wissenschaftliche Anwendung.

Was kann ich noch ausprobieren???
Nix, die Zahlen sind korrekt.

siehe http://forum.jswelt.de/javascript/44549-brauche-hilfe-mwst-rechnet-richtig-2.html#post282468 und ff.
 
Zähl das Maximum der Nachkommastellen der Zahlen bevor du sie subtrahierst. Nach der Subtraktion sind nicht mehr Nachkommastellen vorhanden als vorher. Dann weißt du auf wieviele Nachkommastellen du runden darfst ohne ungenau zu werden.
 
Ich hab eure Postings gerade gelesen. Weiß jetzt nicht mehr genau wer was geschrieben hat, aber ich versuche mal auf alles zu antworten!

BigDecimal wird mit double instanziert!
JAVA != JavaScript! (deswegen hatte ich auch Java geschrieben und nicht JS)

Das mit den Nachkommastellen ist eventuell ein Ansatzpunkt. Ach ja und ich kann leider kein JS verwenden. Programmiere die Anwendung mit JAVA/JSP und lass das ganze auf einem Tomcat Server laufen.

Werde aber nachher nochmal probieren, ob ich mir die richtigen Werte nicht gleich von der DB berechnen und zurückgeben lassen kann. Das wäre sowieso der sauberere Weg!

Falls einem noch was einfällt ... Anregungen kann ich immer gut gebrauchen.
 
JAVA != JavaScript! (deswegen hatte ich auch Java geschrieben und nicht JS)
Aber das hier ist ein Javascript-Forum, mit Java haben hier die wenigsten was am Hut.

Ach ja und ich kann leider kein JS verwenden. Programmiere die Anwendung mit JAVA/JSP und lass das ganze auf einem Tomcat Server laufen.
Der Thread hinter dem Link bezog sich auf Javascript, allerdings gilt das gesagte und die weiterführenden Links oder Suchbegriffe genauso für Java, denn die interne Repräsentation von Gleitkommazahlen dürfte sich nicht großartig unterscheiden (ist schließlich ein anerkannter Standard), von daher gelten bei Java die gleichen oder zumindest vergleichbare Einschränkungen.
Eine absolute Genauigkeit wirst Du nicht hinbekommen, Du kannst höchstens nach einer High-Precision für Java Ausschau halten, aber auch die wird einen Grad von Ungenauigkeit mit sich bringen, denn sonst würde sie infinite-precision heißen.
 
double a = 2.11;
double b = 1.91

double erg = a - b;


==> ERGEBNIS IST: 0.19999999996
==> ERGEBNIS SOLLTE ABER SEIN: 0.2

Hab auch schon mit BigDecimal probiert, da kam dann der selbe 'rotz' bei raus!
Ich bin auf ein richtiges Ergebnis angewiesen, da ich leider nicht runden darf!
Es geht hierbei um eine wissenschaftliche Anwendung.

Was kann ich noch ausprobieren???
Das ist doch schon absolut genau. Schau dir doch mal die Größenordnung der Abweichung an. Wenn du mit Fließkommazahlen rechnest musst du halt immer drauf achten, dass du die Ausgabe formatierst auf soviele Stellen wie du sie brauchst, aber ansonsten rechnet der Computer so genau wie möglich.
 
wobei hier bei genauerem hinsehen, eigentlich eine höhere Genauigkeit erziehlt werden müsste. 0.19999999996 hat wenn ich mich nicht verzählt habe nur 12 digits.
 
und warum soll 2.11 bzw. 1.91 im double bereich darstellbar sein? kannst du 2.11 * 10^1 nicht auch als 211 * 10^-1 übergeben? aber dann könntest du ja auch runden.


du hast bei deiner wissenschaftlichen Anwendung nur subtraktionen/additionen?

Nein natürlich nicht, aber bei diesem einfach Beispiel hat es mir die Zahlen ja schon um die Ohren gehauen.
 
So und jetzt noch zur Lösung. Ich hab das ganze Problem hier jetzt direkt auf der Datenbank berechnen lassen. Hab mir dazu einen entsprechenden Trigger geschrieben.
Das scheint mittlerweile so richtig gut zu funktionieren!

Trotzdem danke an alle für die zahlreichen Kommentare und Tipps.
 
So und jetzt noch zur Lösung. Ich hab das ganze Problem hier jetzt direkt auf der Datenbank berechnen lassen. Hab mir dazu einen entsprechenden Trigger geschrieben.
Das scheint mittlerweile so richtig gut zu funktionieren!

Trotzdem danke an alle für die zahlreichen Kommentare und Tipps.

deine datenbank rechnet auch im binärsystem. egal wo, aber irgendwo mußt du auf deine anzeigegenauigkeit runden, ob in der db oder in deiner anwendung fast egal. Nur misbrauchst du hier (wahrscheinlich) die db für berechnungen, die du direkter und schneller hättest haben können.
 
Zurück
Oben