Algorithmus: Grad von floating zu Grad/Minute/Sekunde

JackintheBox

Mitglied
Hey 🙂

Ich hab keinen Plan ob ich im richtigen Teil des Forums bin, ich probiers einfach mal:

Mein Problem ist folgendes:
Ich bekomme über den Constructor ne Grad angabe in der Form Grad:Minuten:Sekunden zB:
Java:
new Value(33,21,16);
Das wird umgerechnet in n double: 33 + 21/60 + 16/3600
Soweit vorgegeben.

Jetzt muss ich aber in der toString() diesen double wieder so umrechen das ich sowas in der Art
"33:21:16 N" bekomme (N ist dabei einfach nur ne vorzeichen frage). Habt ihr zu diese Frage Ideen, Vorschläge o.ä.? ich hab das gefühl ich müsst wissen wie s geht, steh aber auf dem schlauch.
lg, jaq
 
Wo soll das dann in der Form stehen, und was wird verrechnet, wenns so wieder ausgegeben wird? Kannste vllt alles posten, den Konstruktor und die überschriebene toString()?
 
Das wird umgerechnet in n double: 33 + 21/60 + 16/3600
Soweit vorgegeben.
Ich weiß zwar nicht, inwiefern du was an der internen Repräsentation ändern kannst, aber: double ist auf dem ersten Blick für diese Aufgabe eine ganz, ganz schlechte Wahl:
  • Es verbraucht mehr Speicher als wahrscheinlich nötig (vorausgesetzt, alle Winkel sind kongruent modulo 360°),
  • dürfte wesentlich mehr Zeit bei der Berechnung benötigen als reine Ganzzahloperationen und
  • ist extrem anfällig für Rundungsfehler (wegen des relativ großen Teilers 3600 und dessen Primfaktoren).
Mehr dazu in den FAQs: http://www.java-forum.org/allgemein...uble-float-gleitkommazahlen-alternativen.html

Mein Tipp: verwende Festkommazahlen mit Sekundengenauigkeit (oder so genau, wie du es halt brauchst). Das erspart dir den Umgang mit hässlichen Rundungsfehlern (es sei denn natürlich, du willst mit den Winkeln keine Berechnungen anstellen ^^). Hinweise dazu findest du auch in dem verlinkten Thread. Falls du trotzdem double verwenden möchtest (wovon ich dringend abrate), hier ein Ansatz:

Java:
	public static final String toString(double degree){
		int deg = (int)degree;
		double t = (degree - deg) * 60;
		int min = (int)t;
		t = (t - min) * 60;
		int sec= (int)t;
		return deg + ":" + min + ":" + sec;
	}
Dieser Ansatz berücksichtigt keine Vorzeichen etc., dient aber eventuell als Anregung.

Ark
 
wieso machst du das eigentlich nicht in die andere Richtung? In der Klasse speicherst du Grad, Minuten und Sekunden wie durch den Konstruktor übergeben ab und wenn du die Ausgabe in Dezimal brauchst führst du die Rechnung in einer entsprechenden Methode aus. Dazu brauchts sowohl in der besagten als auch in der "toString()"-Methode nur jeweils eine Zeile.
 

Zurück
Oben