Преобразовать расширенное значение во время

Я хочу преобразовать расширенное значение во время. до десятичного разделителя - часы, после десятичного разделителя - минуты цифровые

8,62944444444444  --> 8:37
1,41666666666667  --> 1:25

Я сделал эту функцию, но я получаю за 1,41666666666667 -> 1:24 Должно быть 25 минут

function MyConvertion(AValue: Extended): TDateTime;
var
    Hour, Min, Sec, MSec: Word;
begin
  Hour:= Trunc(AValue);
  Min:= Trunc(Frac(AValue)*60);
  result:= EncodeTime(Hour, Min, 0, 0);
end;

Когда я использую точное значение 1,41666666666667, я получаю 1:25 Но значение, которое я должен преобразовать, получается из мыльного интерфейса как double (oPostCalculationDay.DirectAssignedWorkTime).

Значение, которое я получаю в режиме отладки = 1,41666666666667

MyConvertion(1,41666666666667) --> 1:25
MyConvertion(oPostCalculationDay.DirectAssignedWorkTime) --> 1:24
MyConvertion(RoundTo(oPostCalculationDay.DirectAssignedWorkTime, -15)) --> 1:25
MyConvertion(RoundTo(oPostCalculationDay.DirectAssignedWorkTime, -16)) --> 1:24
MyConvertion(strtofloat(floattostr(oPostCalculationDay.DirectAssignedWorkTime)))--> 1:25

Я думаю, что-то вроде с плавающей точкой

Но какой лучший метод я должен использовать? Roundto -14, потому что 1,41666666666667 это 14 чисел после разделителя чего-то еще?

1 ответ

Я предполагаю, что значения закодированы следующим образом:

Hours + Minutes/60 

где Hours а также Minutes целые числа и Minutes от 0 до 59 включительно.

Вы должны округлять минуты, а не обрезать их

Min := Round(Frac(AValue)*60);

Если дробная часть содержит секунды или даже миллисекунды, то вам нужно другое вычисление.

Secs := Round(Frac(AValue)*3600);

или же

MSecs := Round(Frac(AValue)*3600000);

Я не вижу особого смысла в использовании расширенных здесь. Этот тип существует только в отличие от double в x86 и в любом случае медленнее, чем double из-за плохого выравнивания, и не дает вам ничего такого, чего вы не можете получить из double.

Другие вопросы по тегам