【问题标题】:Convert extended value to Time将扩展值转换为时间
【发布时间】:2015-06-06 01:35:20
【问题描述】:

我想将扩展值转换为时间。 在 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

我在想类似于Floating points

但是我必须使用的最佳方法是什么?舍入 -14,因为 1,41666666666667 是其他分隔符后的 14 个数字?

【问题讨论】:

  • 这就是我要使用TTimeSpan.FromMinutes() 的地方。我在这里看不到TDateTime 的位置。
  • @TLama 感谢它与 System.TimeSpan.TTimeSpan.FromHours 一起使用
  • @Ravaut 请不要回答问题。我恢复了。

标签: delphi floating-point extended-precision


【解决方案1】:

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

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 获得的东西。

【讨论】:

  • 这给了我 1:25 的 1,41666666666667 但 8:38 的 8,62944444444444。解决方案是来自 TLama
  • 我会四舍五入到毫秒。 1:24:59 很可能应该显示为 1:24。
  • @LURD 这个问题向我表明小时和分钟已使用小时 + 分钟/60 进行编码
  • 8,62944444444444 是 8:37:46。
  • @LURD 当我调试时我得到 8,62944444444444 但它不止于此。
猜你喜欢
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多