Eclipse Indig: sekunden umrechnen
Guten Nachmittag:
Ich benutze derzeit Eclipse Indigo, ich bin Anfänger und versuche eine ziemlich einfaches Programm zu schreiben. Was das Programm macht: Man gibt eine zeit in std:min:sec an, das Programm rechnet die Zeit in sec um und soll 70% der eingegebenen Zeit wieder ausgeben. Es funktioniert auch alles außer das umrechnen der sekunden zurück in std:min:sec... derzeit habe ich leiderRundungsfehler um 1 sec und finde einfach nicht heraus wie ich das machen könnte...
Kann mir einer von euch vielleicht den Code schreiben wenn ich eine Zahl (endZahl) in sek habe, und diese eben immer gleich umgerechnet werden soll und welche Datentypen ich da am besten benutze...
Vielen dank im Voraus
1 Antwort
Tritt der Rundungsfehler bei den 70% aus, oder bei dem Aufteilen in Stunden / Minuten / Sekunden?
int sec = ...
int min = sec / 60
sec = sec % 60
int hour = min / 60
min = min % 60
Das ist eigentlich die klassische Umrechnung von Sekunden in Sekunde/Minute/Stunde
der Rundungsfehler tritt beim umrechnen auf
Nein, Integer haben keine Kommastellen.
Mein code berechnet Stunde, Minute und Sekunde, die Ausgabe hatte ich jetzt weggelassen.
Bitte stell deinen Code zur Verfügung, dann wird eventuell klarer was du willst.
Ok, du hattest recht:D Dein Code ist perfekt und es treten keine Rundungsfehler auf...
Wenn ich mir deinen im vergleich zu meinem anschaue...naja schau selbst^^
float LZEchtD=(LZEcht);
int LZEchtI = ((int)LZEcht);
float LZStundenD = (LZEchtD)/(60*60);
int LZStundenI = (LZEchtI)/(60*60);
float LZMinZwischenD = LZStundenD - LZStundenI;
float LZMinD = LZMinZwischenD*60;
int LZMinI = (int)LZMinD;
float LZSekZwischen = LZMinD - LZMinI;
float LZSekD = LZSekZwischen*60;
int LZSekI = (int)LZSekD;
Okay, ich hab das Problem erkannt. Einfach gesagt: Double und Float sind Teufelszeug, erwarte nie das richtige Ergebnis.
Mathematisch ist deine Lösung absolut korrekt. LZSekD müssten genau die Sekunden sein. Allerdings tritt bei der Fließkommaarithmetik immer eine gewisse Ungenauigkeit auf. Bei der 7. bis 8. Nachkommastelle hast du bereits Rundungsfehler, die sich natürlich Fortsetzen und immer schlimmer werden.
Wenn jetzt also LZSekD also nicht 5 sondern 4,999999997 ist (nur als Beispiel) dann rundet "(int)LZSekD" immer ab. Es wird also 4.
Daher mein Rat: Bevor du Double oder Float verwendest, google nach einer Lösung. Für dieses Problem hättest du den Code wie ich ihn dir geschrieben habe gefunden. Und wenn du doch mal Double verwenden musst, schau dir in der Dokumentation unter "Math" die Methoden zum Runden an.
Danke für die Antwort, so etwas dachte ich mir schon...war aber die einzige möglichkeit die mir auf nach langen überlegen eingefallen ist;)
Hätte noch eine letzte Frage wo du schon mal da bist:
Hab das programm mit einem eingabefeld, einem ausgabefeld und einem button gemacht (window builder) Kanst du mir sagen wie ich für dieses programm ein Icon einsetzten kann? (also das da nicht die kaffeetasse ist sondern ein von mir eingestelltes bild)
Danke
tut mir leid, vielleicht habe ich mich hier falsch ausgedrückt, ich meinte eigentlich, das die zeit so angezeigt wird...zB. 2:34:47
wenn ich einfach durch 60 rechne komme ich zwar auf die zeit, aber mit kommastellen...