Преобразовать расширенное значение во время
Я хочу преобразовать расширенное значение во время. до десятичного разделителя - часы, после десятичного разделителя - минуты цифровые
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.