gpt4 book ai didi

delphi - 将扩展值转换为时间

转载 作者:行者123 更新时间:2023-12-03 18:36:07 25 4
gpt4 key购买 nike

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

我在 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

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

最佳答案

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

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

关于delphi - 将扩展值转换为时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29390218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com