/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
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
>
>



Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408518
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste