delphi - 将扩展值转换为时间

标签 delphi floating-point extended-precision

我想将扩展值转换为时间。 小数分隔符之前是小时 小数点分隔符后面是分钟数字

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 

其中 HoursMinutes 是整数,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/

相关文章:

forms - 当子模态表单最小化时最小化整个应用程序

delphi - FreePascal 中 Max 函数的意外结果

delphi - 我得到 'Variable x inaccessible here due to optimization'

c++ - 如何在 C++ 中编写可移植的浮点运算?

haskell - 递归 Haskell;牛顿法 : Why Doesn't This Converge?

c++ - 返回浮点类型是否完全符合 IEEE-754 的函数?

delphi - Delphi 动态数组包含哪些簿记数据?

floating-point - OCaml 中的 80 位扩展精度浮点

c - gcc 在 amd64 上支持 128 位 int 吗?

bash - 我如何在 bash 中使用浮点运算?