2012-11-02 22 views
5

私はEncodeDateTimeEncodeTimeの方法に関して何らかの奇妙な振る舞いを観察しましたが、私はいくつかの説明を求めています。TTimeの比較が予期しない結果をもたらすのはなぜですか?

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; 

私は何を見つけたことはdateの時間の部分が7:59:59代わりの8:00:00に評価という点です。しかし、timedateの時間部分を9に設定すると、アサートが成功し、dateが期待値に評価されます。いくつかの時間は働きますが、他の時間は働きません。誰かが何が起こっているか私に説明できますか?

答えて

7

時間値(TTimeTDateTDateTime)は整数部で符号化日付、および小数部分によってで符号化された時間で、(すなわち、浮動小数点値である)実際doubleあります。浮動小数点値の等価性をテストすることは常に危険です。

代わりにSameTime(time, date)を使用できます。これは正しく「数値的な騒ぎ」を補う:Result := Abs(Frac(A) - Frac(B)) < OneMillisecond;

関連する問題