Функция ГРП теряет точность
У меня есть переменная TDateTime, которой присваивается значение во время выполнения 40510.416667. Когда я извлекаю время в переменную типа TTime, используя функцию Frac, она устанавливает его в 0,41666666666. Почему он изменил точность значения, и есть ли рабочая среда, чтобы сохранить точность от исходного значения, т.е. установить его на 0,416667.
4 ответа
Одна из причин потери точности заключается в том, что TDateTime является двойным, а параметр и возвращаемое значение Frac имеют тип Extended.
При преобразовании чисел с плавающей запятой из одного типа в другой, некоторая точность может быть потеряна. (То же самое относится и к арифметике).
Для правильного сравнения значения с плавающей запятой следует использовать функцию CompareValue из модуля Math.
TDateTime - число с плавающей запятой. Некоторые числа не могут быть представлены точно как число с плавающей запятой. 0.416667 / 0.41666666666 может показаться другим.
Вы можете округлить до 5 или 6 цифр для отображения. Это дает вам точность около 1 секунды.
Помогает то, что должен знать каждый специалист по компьютерам о числах с плавающей запятой, так же, как и собственная точность определения чисел с плавающей запятой в SO - это даст вам некоторую подробную информацию, которая будет соответствовать ответу Джеффа.
Спасибо за вашу помощь в этом, очень ценится. Чтобы обойти мою проблему, которая возникла из-за изменения точности, я использовал функцию CompareTime вместо операторов>= или <= для сравнения времени.