2012-11-02 18 views
5

EncodeDateTime ve EncodeTime yöntemleri ile ilgili bir tür garip davranış gözlemledim ve bazı açıklamaları arıyorum.TTime karşılaştırmaları neden beklenmedik sonuçlar veriyor?

procedure SomeTestCase; 
var 
    time: TTime; 
    dateTime: TDateTime; 
begin 
    time := EncodeTime(8, 0, 0, 0); 
    date := EncodeDateTime(2012, 11, 2, 8, 0, 0, 0); 

    Assert(time = TimeOf(date)); //Fails 
end; 

Ne buldum date 'ın saatlik kısmı 7:59:59 yerine 8:00:00 olarak değerlendirilir olmasıdır. Ancak time ve date saat bölümünü 9'a ayarlıyorum, assert geçer ve date beklenen değere değerlendirir. Bazı saatler çalışırken diğerleri çalışır. Birisi bana neler olduğunu açıklayabilir mi?

cevap

7

bir zaman değeri (TTime, TDate, TDateTime) aslında bir double (yani, bir kayan noktalı değer olan), tam sayı kısmen kodlanmış tarih ve kesirli kısmı tarafından kodlanmıştır kez. Kayan nokta değerlerinin eşitliğini test etmek her zaman risklidir.

Bunun yerine SameTime(time, date)'u kullanabilirsiniz. Bu, 'sayısal yaygara' için doğru şekilde telafi eder: Result := Abs(Frac(A) - Frac(B)) < OneMillisecond;