J'essaie d'afficher le temps d'exposition EXIF en fraction de seconde mais je n'obtiens pas le résultat attendu, probablement une petite erreur.Calcul du temps d'exposition EXIF en fraction (Delphi)
J'ai trouvé deux routines qui font le calcul mais qui apportent des résultats différents et faux.
La valeur que je rencontre est: "0.0806451612903226" la valeur est de type étendu.
DecimalToFractStr me donner: "16129/200000" en conséquence, DecToFrac me donne: "5/62" à la suite
Résultat attendu devrait être "1/12", puisque tout le monde est ce (ce que est l'astuce). Lorsque je clique avec le bouton droit de la souris sur l'image dans l'explorateur et affiche les détails, j'obtiens cette valeur. Comment l'obtenir dans ma demande? J'espère que quelqu'un peut m'aider ici.
Cordialement Roy M Klever
RESOUDRE! Ok après quelques tests, je l'ai compris. En utilisant le résultat de DecToFrac, ils le divisent simplement en entier avec le résultat du côté gauche. 5 div 5 = 1/62 div 5 = 12 donc je suis parti avec le résultat voulu 1/12.
Merci pour votre contribution.
Cordialement 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;
Je vois ce que vous voulez dire. Je me demande simplement comment les autres obtiennent le résultat, peut-être arrondi quelque part ... Je veux seulement pouvoir afficher la même valeur que les autres logiciels, donc j'ai besoin de trouver une solution. J'ai donné ce que j'ai de données, avez-vous une idée de la façon dont ils arrivent au résultat "1/12"? –
"Autres"? Est-ce un devoir? Ils ne doivent pas être codés de la même façon que vous. Je n'ai pas creusé dans votre code pour comprendre ce que vous faites, mais ce n'est pas simple. – duffymo
Non, avec d'autres, je veux dire des applications capables d'afficher des données EXIF et donnant la valeur "1/12" comme résultat. Eh bien, j'essaie de comprendre comment ils le font ... Si je dois faire d'autres calculs, ça me convient mais j'ai besoin d'un peu d'aide pour ce que je devrais rechercher. –