|
| Sammenlign to float Fra : Michael Vilhelmsen |
Dato : 10-12-02 08:52 |
|
Hej
Jeg har i mit program et TCurrencyEdit kombonent fra RxLib.
Når jeg laver en OnExit procedure, hvori jeg måler på værdien før og den nye
indtastede, lavede jeg nogle advarsler.
F.eks.
Min originale værdi er 299,95 og min TCurrencyEdit.Value er 299,95.
På trods af, at de er identiske, bliver følgende udsagn sandt:
if (TCurrencyEdit.VAlue {Extended} <>HuskeSalgsPris {Double}) then
begin
// Jeg kommer herind i.
end;
Jeg har så prøvet, at skrive begge variable på skærmen (i nogle labels.).
Nogen med FormatFloat, Andre med FloatToStr for at se, om der skulle være
nogle decimale helt ude på overdrevet.
Det er der ikke !
For at løse mit problem, er jeg nød til at måle på FormatFloat på begge
værdier.
Så virker det.
Er der nogen der ved hvorfor ?
Michael
| |
Landinspektør Klaus ~ (10-12-2002)
| Kommentar Fra : Landinspektør Klaus ~ |
Dato : 10-12-02 14:36 |
|
Det er en gylden regel aldrig at sammenligne flydende kommatal direkte,
fordi de forskellige typer af flydende komma variable repræsenterer tallene
forskelligt i hukommelsen og resultatet af en sammenligning ikke er særlig
gennemskuelig. Brug i stedet en konstruktion som:
if (TCurrencyEdit.VAlue - HuskeSalgsPris )<0.001 then
mvh Erik Dam
"Michael Vilhelmsen" <smom22.remove_this_tekst@tdcadsl.dk> skrev i en
meddelelse news:s2hJ9.63151$HU.4665546@news010.worldonline.dk...
> Hej
>
> Jeg har i mit program et TCurrencyEdit kombonent fra RxLib.
> Når jeg laver en OnExit procedure, hvori jeg måler på værdien før og den
nye
> indtastede, lavede jeg nogle advarsler.
>
> F.eks.
> Min originale værdi er 299,95 og min TCurrencyEdit.Value er 299,95.
>
> På trods af, at de er identiske, bliver følgende udsagn sandt:
>
> if (TCurrencyEdit.VAlue {Extended} <>HuskeSalgsPris {Double}) then
> begin
> // Jeg kommer herind i.
> end;
>
> Jeg har så prøvet, at skrive begge variable på skærmen (i nogle labels.).
> Nogen med FormatFloat, Andre med FloatToStr for at se, om der skulle være
> nogle decimale helt ude på overdrevet.
> Det er der ikke !
>
> For at løse mit problem, er jeg nød til at måle på FormatFloat på begge
> værdier.
> Så virker det.
>
> Er der nogen der ved hvorfor ?
>
> Michael
>
>
| |
Landinspektør Klaus ~ (10-12-2002)
| Kommentar Fra : Landinspektør Klaus ~ |
Dato : 10-12-02 15:28 |
|
"Landinspektør Klaus Gjærup" <KlausG@PLF.DK> skrev i en meddelelse
news:3df5f6e2$0$199$edfadb0f@dread14.news.tele.dk...
> Det er en gylden regel aldrig at sammenligne flydende kommatal direkte,
> fordi de forskellige typer af flydende komma variable repræsenterer
tallene
> forskelligt i hukommelsen og resultatet af en sammenligning ikke er særlig
> gennemskuelig. Brug i stedet en konstruktion som:
> if (TCurrencyEdit.VAlue - HuskeSalgsPris )<0.001 then
>
> mvh Erik Dam
Oops..
Det skal selvfølgelig være:
if ABS(TCurrencyEdit.VAlue - HuskeSalgsPris )<0.001 then
| |
René Allan Larsen (10-12-2002)
| Kommentar Fra : René Allan Larsen |
Dato : 10-12-02 19:07 |
|
In article <s2hJ9.63151$HU.4665546@news010.worldonline.dk>, Michael Vilhelmsen
wrote:
> Hej
>
> Jeg har i mit program et TCurrencyEdit kombonent fra RxLib.
> Når jeg laver en OnExit procedure, hvori jeg måler på værdien før og den nye
> indtastede, lavede jeg nogle advarsler.
>
> F.eks.
> Min originale værdi er 299,95 og min TCurrencyEdit.Value er 299,95.
>
> På trods af, at de er identiske, bliver følgende udsagn sandt:
>
> if (TCurrencyEdit.VAlue {Extended} <>HuskeSalgsPris {Double}) then
Bemærk at kommatal ikke kan sammenlignes på den måde, da det kun er meget få
kommatal, som kan gemmes nøjagtigt i det binære talsystem. Her er et lille
testprogram, som viser problemet:
{$APPTYPE CONSOLE}
var
E : Extended;
D : Double;
F : Single;
R : Real;
R48 : Real48;
begin
E := 299.95;
D := 299.95;
F := 299.95;
R := 299.95;
R48 := 299.95;
WriteLn('Test 1:');
WriteLn('E = ', E);
WriteLn('D = ', D);
WriteLn('F = ', F);
WriteLn('R = ', R);
WriteLn('R48 = ', R48);
WriteLn('Test 2:');
WriteLn('E = ', E:0:30);
WriteLn('D = ', D:0:30);
WriteLn('F = ', F:0:30);
WriteLn('R = ', R:0:30);
WriteLn('R48 = ', R48:0:30);
end.
En anden løsning (udover at bruge FormatFloat()) er at teste om forskellen
mellem de to værdier ligger under en eller anden grænseværdi, som her:
if (Abs(TCurrencyEdit.Value - HuskeSalgsPris) < 0.01) then
MVH, René
| |
Ulrik Vadstrup (10-12-2002)
| Kommentar Fra : Ulrik Vadstrup |
Dato : 10-12-02 12:20 |
|
"Michael Vilhelmsen" <smom22.remove_this_tekst@tdcadsl.dk> wrote in message
news:s2hJ9.63151$HU.4665546@news010.worldonline.dk...
> Hej
>
> Jeg har i mit program et TCurrencyEdit kombonent fra RxLib.
> Når jeg laver en OnExit procedure, hvori jeg måler på værdien før og den
nye
> indtastede, lavede jeg nogle advarsler.
>
> F.eks.
> Min originale værdi er 299,95 og min TCurrencyEdit.Value er 299,95.
>
> På trods af, at de er identiske, bliver følgende udsagn sandt:
>
> if (TCurrencyEdit.VAlue {Extended} <>HuskeSalgsPris {Double}) then
> begin
> // Jeg kommer herind i.
> end;
>
<Snip>
Afrunding på single i forhold til extended ?
Er det muligt at lave begge "variable" af samme type. - Skiv evt.
TCurrencyEdit.VAlue over i en Single først ?
Bare en ide
Ulrik
| |
Michael Vilhelmsen (12-12-2002)
| Kommentar Fra : Michael Vilhelmsen |
Dato : 12-12-02 11:36 |
|
tak til alle.
Jeg benytter bare en format float
Michael
"Michael Vilhelmsen" <smom22.remove_this_tekst@tdcadsl.dk> skrev i en
meddelelse news:s2hJ9.63151$HU.4665546@news010.worldonline.dk...
> Hej
>
> Jeg har i mit program et TCurrencyEdit kombonent fra RxLib.
> Når jeg laver en OnExit procedure, hvori jeg måler på værdien før og den
nye
> indtastede, lavede jeg nogle advarsler.
>
> F.eks.
> Min originale værdi er 299,95 og min TCurrencyEdit.Value er 299,95.
>
> På trods af, at de er identiske, bliver følgende udsagn sandt:
>
> if (TCurrencyEdit.VAlue {Extended} <>HuskeSalgsPris {Double}) then
> begin
> // Jeg kommer herind i.
> end;
>
> Jeg har så prøvet, at skrive begge variable på skærmen (i nogle labels.).
> Nogen med FormatFloat, Andre med FloatToStr for at se, om der skulle være
> nogle decimale helt ude på overdrevet.
> Det er der ikke !
>
> For at løse mit problem, er jeg nød til at måle på FormatFloat på begge
> værdier.
> Så virker det.
>
> Er der nogen der ved hvorfor ?
>
> Michael
>
>
| |
|
|