Одной из причин потери точности является то, что TDateTime имеет тип double, а параметр и возвращаемое значение Frac имеют тип Extended.
При преобразовании чисел с плавающей запятой из одного типа в другой, некоторая точность может быть потеряна. (То же самое относится и к арифметике).
Для правильного сравнения значения с плавающей запятой, вы должны использовать функцию CompareValue из модуля Math.