Rechenfehler?

Status
Nicht offen für weitere Antworten.
T

tuxedo

Gast
Hi,

kann mir jemand sagen warum

Code:
System.out.println(4917.4648 - 4917);

0.464799999999741 ergibt statt 0.4648 ???

Hintergrund:

Ich muss Winkeldaten aus einem GPS-Datensatz umrechnen. Und das möglichst genau. Aber ich scheitere ja schon daran....

Vom Empfänger bekomme ich einen String der so aussieht:

"4917.4648"

Um die Winkelsekunden zu extrahieren muss ich von 4917.4648 4917 abziehen und das Ergebnis mit 60 multplizieren. Aber wenn beim abziehen schon nicht das richtige rauskommt hab ich ja ungewünschte ungenauigkeiten im Programm das mit den GPS Daten umgehen soll...

Wie krieg ich's hin dass der da korrekt rechnet und nicht ne ungenauigkeit weiteren 8 nachkommastellen reinhaut ?
Okay, das mag minimal sein. Aber ich hätt's halt schon gerne von vornerein exakt. Muss doch gehen....


- Alex
 
T

tuxedo

Gast
Okay okay, ich gestehe. Etwas Hintergrundwissen hab ich ja.. Dass es an Glizkommazahlen und der Art und Weise wie die CPU rechnet liegt wusste ich.

Dachte aber dass ne moderne Sprache wie Java dafür ne Lösung hat.
Wenn nicht muss ich halt mit Leben ...

-Alex
 
T

tuxedo

Gast
D.h. da kommt dann das raus was ich will oder sind im Ergebnis noch mehr 9er, also noch mehr nachkommastellen drin?
 

The_S

Top Contributor
Da kommt das Richtige raus (also ich hab schon ein paar mal damit gearbeitet und bis jetzt immer das richtige Ergebnis bekommen ;) ).

Alternativ könntest du dir die Nachkommastellen merken und nach dem subtrahieren runden.
 
T

tuxedo

Gast
Denke ich benutz jetzt BigDecimal. Habs eben Probiert:

Code:
		BigDecimal bd = new BigDecimal("4917.4648");
		System.out.println(bd.subtract(new BigDecimal(bd.intValue())));

liefert tatsächlich 0.4648 ....

Denke das wird genauer sein als das mit dem manuellen runden, oder ?
 
T

tuxedo

Gast
Och menno... Jetzt gehts auch mit BigDecimal nicht so wirklich.. Wenn ich zu meinem letzten Beispiel noch * 60 machen willkommt auch hier das "falsche" raus.

Code:
		BigDecimal bd = new BigDecimal("4917.4648"); 
		System.out.println(bd.subtract(new BigDecimal(bd.intValue())).multiply(new BigDecimal(60)));

Ergibt 27,8880 statt 28,10 ... Also 0,788 Abweichung....
Das ist zu viel Abweichung ...

Man, warum kann das der Windows-Taschenrechner und mein popeliges Java-Programm nicht.

So macht das doch wirklich keinen Spass.
 
T

tuxedo

Gast
HALT STOP.Mein Fehler. Das Ergebnis passt.

BigDecimal kanns doch. Fehler lag auf meinem Blatt papier vor mir. Hab was falsch abgeschrieben ...

-Alex
 

Leroy42

Top Contributor
alex0801 hat gesagt.:
0.464799999999741 ergibt statt 0.4648 ???
Ich muss Winkeldaten aus einem GPS-Datensatz umrechnen. Und das möglichst genau. Aber ich scheitere ja schon daran....

Glaub' mir, das ist genau genug! :wink:

(Ich selbst nutze nur floats für den GPS-Datensatz; und es reicht)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben