TTime - błędne porównanie wartości zmiennych

0

Witam.
Mam dwie zmienne o typie TTime
Do zmiennych są przypisane wartości czasu w formacie 00:00:30 - jest to czas wolny i czas potrzebny na wykonanie zadania - obydwa czasy są identyczne a jak porównuję te czasy w warunku to nie spełnia go - uproszczony przykład:

 
var
A,B,C:TTime;
begin 
 A:=StrToTime('10:00:00');
 B:=StrToTime('10:30:00');
 C:=StrToTime('00:30:00');

 if (B-A)=C then
  ShowMessage('OK'); //<<-- ten warunek nie jest spełniony :(
end;

Warunek w powyższym wyrażeniu nie jest prawdziwy - czy może ktoś wytłumaczyć dlaczego ? warunek z wyrażenia powyżej jest prawdziwy jeżeli zmienimy znak na '<' ?

0
program ideone;

uses SysUtils;

var A,B,D,C:TTime;
begin 
  A:=StrToTime('10:00:00');
  B:=StrToTime('10:30:00');
  C:=StrToTime('00:30:00');
  D:=B-A;

  WriteLn('A=',A,';');
  WriteLn('B=',B,';');
  WriteLn('C=',C,';');
  WriteLn('D=',D,';');
  WriteLn('C-D=',C-D,';');
end.

http://ideone.com/nLbZX0

0

... a gdzie tu rozwiązanie tego problemu ??

0

Zadałeś dwa pytania:

adam myszor napisał(a):

Warunek w powyższym wyrażeniu nie jest prawdziwy - czy może ktoś wytłumaczyć dlaczego ? warunek z wyrażenia powyżej jest prawdziwy jeżeli zmienimy znak na '<' ?
Na oba pytania powyższy kod odpowiada.
Może ci pomóc jeszcze to:
http://pl.wikipedia.org/wiki/Liczba_zmiennoprzecinkowa#B.C5.82.C4.99dy_operacji_elementarnych
Jak chcesz porównywać to zaokrąglaj do sekund:

if Round(C*SecsPerDay)=Round(D*SecsPerDay) then
0

To ja dodam jeszcze, że istnieje taki moduł jak DateUtils zawierający funkcje do operowania na dacie i czasie DateUtils .
Nie wiem też gdzie jest zadeklarowany typ TTime powinieneś użyć TDateTime, taki właśnie zwraca funkcja StrToTime.

0

TTime to tak naprawdę to samo co typ Double, gdzie wartość 1 to 24 godziny
ze względu na dokładność reprezentacji w tej postaci podanych przez Ciebie czasów lepiej użyć warunku :

if abs(B-A-C)< 1/24/3600/10  then
....

ułamek po prawej stronie warunku to 1/10 sekundy

1 użytkowników online, w tym zalogowanych: 0, gości: 1