我想将扩展值转换为时间。 在DecimalSeparator之前是几个小时 在decimalcparator之后是数字分钟
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 但是我必须转换的值来自soap enterface 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
我想的是Floating points
但我必须使用的最佳方法是什么? Roundto -14因为1,41666666666667在其他东西的分隔符之后是14个数字?
答案 0 :(得分:2)
我的假设是值的编码如下:
Hours + Minutes/60
其中Hours
和Minutes
是整数,Minutes
介于0和59之间。
你需要围绕分钟而不是截断它们
Min := Round(Frac(AValue)*60);
如果小数部分包含秒或甚至毫秒,那么您需要不同的计算。
Secs := Round(Frac(AValue)*3600);
或
MSecs := Round(Frac(AValue)*3600000);
我在这里使用延伸并没有多大意义。该类型仅存在与x86上的double不同,并且在任何情况下都由于较差的对齐而慢于double,并且在这里没有为您提供任何无法从double获取的内容。