![]() |
Re: Stunden/Minuten in Dezimalwerten
Wenn du die werte voeher in Integer (z.B. mit minuten) umwandelst und dann damit weiterrechnest, dann kannst du zumindestens weitere Rundungsfehler (basierend auf die Fließkommazahlen) vermeiden.
FloatingPointUnit (Fließkommaeinheit) ... halt das Ding in deinem Rechner, welches mit den reellen Zahlen rechnet.
Delphi-Quellcode:
i := Round((Ende - Start) * (24*60));
//i = minuten ![]() hier mal ein "extremes" Beispiel für die Ungenauigkeiten bei reellen Typen: (benötigt nur 2 TLabels und einen TButton)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer; r: single; begin r := 0; i := 0; repeat r := r + 0.0001; i := i + 1; Label1.Caption := FloatToStr(r); Label2.Caption := FloatToStr(i / 10000); Application.ProcessMessages; until application.Terminated; end; |
Re: Stunden/Minuten in Dezimalwerten
Ok also ist es besser erst alles in Minuten umzurechnen also zb. so
Delphi-Quellcode:
Anschießend könnten alle Minuten in der Tabelle addiert werden und dann mit "Minuten/60" zu Stunden und Minuten berechnet werden seh ich das so richtig ?
procedure TForm1.SpeedButton1Click(Sender: TObject);
var Start, Ende, Gesamt: TDateTime; iTmp:Integer begin Start := StrToDateTime(eStart.Text); //zb. von 08:00 Ende := StrToDateTime(eEnde.Text); // bis 09:00 Gesamt:= (Ende - Start); iTmp := Round((Gesamt) * (24*60)); eGesamt.Text := IntToStr(iTmp); end; |
Re: Stunden/Minuten in Dezimalwerten
Du könntest auch diese Funktion aus den DateUtils verwenden:
function MinutesBetween(const ANow, AThen: TDateTime): Int64;
Delphi-Quellcode:
Grüße
eGesamt.Text:=IntToStr(MinutesBetween(StrToDateTime(eStart.Text),StrToDateTime(eEnde.Text)));
Klaus |
Re: Stunden/Minuten in Dezimalwerten
jupp, wäre möglich :)
minuten := MinutesBetween(StrToDateTime(eStart.Text), StrToDateTime(eEnde.Text))); macht och nur minuten := Abs(Round((StrToDateTime(eEnde.Text) - StrToDateTime(eStart.Text)) * (24*60))); und da eEnde vermutlich immer nach eStart liegt, kann das Abs entfallen. ein div statt / erspart dir dann wiederum den weg über reelle typen.
Delphi-Quellcode:
stunden := gesamtminuten div 60;
minuten := gesamtminuten mod 60; PS: falls du maximal 4 nachkommastellen benötigst ... Currency ist in Wirklichkeit ein Int64 (64 Bit-Integer), nur das der automatisch (wenn es nötig ist) entsprechend umgewandelt wird, so das er wie ein fließkommatyp mit maximal 4 Nachkommastellen wirkt. wäre bei 1.0 = 1 Tag eine Genauigkeit von 0,144 Minuten |
Re: Stunden/Minuten in Dezimalwerten
Also kann ich bei dieser Methode bleiben?
Delphi-Quellcode:
und anschließende Umrechnung der Gesamtminuten in Stunden mit
procedure TForm1.SpeedButton1Click(Sender: TObject);
var Start, Ende, Gesamt: TDateTime; iTmp:Integer begin Start := StrToDateTime(eStart.Text); //zb. von 08:00 Ende := StrToDateTime(eEnde.Text); // bis 09:00 Gesamt:= (Ende - Start); iTmp := Round((Gesamt) * (24*60)); eGesamt.Text := IntToStr(iTmp); end;
Delphi-Quellcode:
stunden := gesamtminuten div 60;
wäre das also ziemlich genau ? |
Re: Stunden/Minuten in Dezimalwerten
Wenn dir die Minutenauflösung reicht, dann geht es wohl kaum besser.
So hast du ja alles in Minuten und keine weiteren Rundungsfehler mehr ... wäre also gut so ^^ |
Re: Stunden/Minuten in Dezimalwerten
Ja Minuten reicht aus Sekunden brauch ich nicht ist ja nur zur Privaten Stundenabrechnung (Gesamtminuten werden dann addiert und in Stunden (Dezimalausgabe mit max 3 Kommazeichen) ausgegeben
DANKE FÜR DIE HILFE !!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz