我试图将EXIF曝光时间显示为几分之一秒,但我没有得到预期的结果,可能是一个小错误。
我找到了两个进行计算的例程,但都带来了不同和错误的结果。
我遇到的问题是:“0.0806451612903226”值的类型为Extended。
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;
答案 0 :(得分:4)
1/12实际上并不是该值的正确结果。
也许他们可能有某种“对齐”查找表,即这个值最接近增量值列表的1/12?
答案 1 :(得分:3)
也许他们对常见的曝光时间进行了硬编码,并选择了最接近的曝光时间?
答案 2 :(得分:1)
我无法通过阅读您的代码来判断,但我想知道您是否因为在某处错误地应用整数除法而遇到问题。
如果您确定1/12 = 0.0833333333 .....是您应该得到的答案,那么您报告的所有结果都是错误的:
我遇到的问题是:“0.0806451612903226”值的类型为Extended。
DecimalToFractStr给我:“16129/200000”结果,DecToFrac给了我:“5/62”因此
这三个都错了。
一旦你将你的价值表示为两个整数的比率,我本来期望看到greatest common divisor更多的内容。
答案 3 :(得分:0)
解决了!经过一些测试后我发现了。使用DecToFrac的结果,他们只需将整数除以左侧的结果。 5 div 5 = 1/62 div 5 = 12所以我留下想要的结果1/12。
感谢您的所有意见。
亲切的问候Roy M Klever