2

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

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 但我必须转换的值来自肥皂输入界面作为双精度(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 个数字?

4

1 回答 1

2

我的假设是这些值是这样编码的:

Hours + Minutes/60 

其中HoursMinutes是整数,Minutes介于 0 和 59 之间。

您需要四舍五入而不是截断它们

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

如果小数部分包含秒甚至毫秒,那么您需要进行不同的计算。

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

或者

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

我认为在这里使用扩展没有多大意义。该类型仅在 x86 上与 double 不同存在,并且由于对齐不良,在任何情况下都比 double 慢,并且在这里没有给您任何您无法从 double 获得的东西。

于 2015-04-01T12:28:25.463 回答