我试图将 EXIF 曝光时间显示为几分之一秒,但我没有得到预期的结果,可能是一个小错误。
我发现了两个进行计算但都带来不同和错误结果的例程。
我遇到问题的值是:“0.0806451612903226”值属于扩展类型。
DecimalToFractStr 给我:"16129/200000" 结果,DecToFrac 给我:"5/62" 结果
预期结果应该是“1/12”,因为每个人都得到它(有什么诀窍)。当我在资源管理器中右键单击图像并查看详细信息时,我得到了这个值。如何在我的应用程序中获取它?希望有人可以在这里帮助我。
亲切的问候 Roy M Klever
解决了!好的,经过一些测试,我想通了。使用 DecToFrac 的结果,他们只需将其与左侧的结果进行整数相除。5 div 5 = 1 / 62 div 5 = 12 所以我得到了想要的结果 1 / 12。
感谢您的所有意见。
亲切的问候 Roy M Klever
procedure DecimalToFract(value: double; AllowedDecimals: integer; var num, den:
integer);
var
d, i: integer;
ex: boolean;
begin
d := Trunc(power(10, AllowedDecimals));
num := Trunc(value * d);
den := d;
repeat
ex := true;
for i := 10 downto 2 do
if ((num mod i) = 0) and ((den mod i) = 0) then
begin
num := num div i;
den := den div i;
ex := false;
end;
until ex;
end;
function DecimalToFractStr(value: double): string;
var
num, den: integer;
begin
DecimalToFract(value, 6, num, den);
if den = 1 then
result := inttostr(num)
else
result := inttostr(num) + '/' + inttostr(den);
end;
function Dec2Frac(f: Double): String;
var
df: Double;
lUpperPart: Integer;
lLowerPart: Integer;
begin
lUpperPart := 1;
lLowerPart := 1;
df := lUpperPart / lLowerPart;
While (df <> f) do
begin
If (df < f) Then
lUpperPart := lUpperPart + 1
Else
begin
lLowerPart := lLowerPart + 1;
lUpperPart := Trunc(f * lLowerPart);
end;
df := lUpperPart / lLowerPart;
end;
if lLowerPart = 1 then
result := IntToStr(lUpperPart)
else
result := IntToStr(lUpperPart) + '/' + IntToStr(lLowerPart);
end;