我想将扩展值转换为时间。 小数分隔符之前是小时 小数点分隔符后面是分钟数字
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 输入中的值转换为 double (oPostCalculationDay.DirectAssignedWorkTime)。
我在 Debug模式下获得的值 = 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
但是我必须使用的最佳方法是什么?舍入 -14 因为 1,41666666666667 是其他分隔符后面的 14 个数字?
最佳答案
我的假设是这些值的编码如下:
Hours + Minutes/60
其中 Hours
和 Minutes
是整数,Minutes
介于 0 到 59 之间(包含 0 和 59)。
您需要对分钟进行四舍五入而不是截断它们
Min := Round(Frac(AValue)*60);
如果小数部分包含秒甚至毫秒,那么您需要不同的计算。
Secs := Round(Frac(AValue)*3600);
或
MSecs := Round(Frac(AValue)*3600000);
我认为在这里使用扩展没有多大意义。该类型仅与 x86 上的 double 不同,并且在任何情况下由于对齐不良而比 double 慢,并且这里没有为您提供无法从 double 获得的任何内容。
关于delphi - 将扩展值转换为时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29390218/