Bei dem Code
showmessage(FloatToStr(20E30));
erhält man 2E31
als Anzeige.
Das ist soweit OK, denn 20E30
ist ja auch gleich 2E31.
Allerdings bringt der Code
var
a,
b:
Extended;
begin
a :=
20E30;
b :=
2E31;
if a
= b
then
showmessage('gleich')
else
showmessage('ungleich');
end;
die Anzeige "ungleich" und
showmessage(FloatToStr(a
- b))
ergibt sogar
die Differenz von
1099511627776
($10000000000),
was an der internen
bitweisen Vergeichsweise liegt. Solange die Werte unterhalb von
MaxDouble
liegen,
kann man statt
Extended
einfach den Typ
Double
verwenden um solche Fehler zu
vermeiden. Ansonsten muss man einen kleinen Trick anwenden:
function wandeln(z: Extended): Extended;
begin
Result := StrToFloat(FloatToStr(z));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
a, b: Extended;
begin
a := wandeln(20E30);
b := wandeln(2E31);
if a = b then showmessage('gleich') else showmessage('ungleich');
showmessage(FloatToStr(a - b))
end;
|