Aber ich vermute das du auf
anspielst? Da so eh der Vergleich auf TRUE gemacht wird?
Im Prinzip ja, aber
Boolean ist 1 Byte groß und kennt somit 256 verschiedene Werte.
Die Konstanten True und False sind jeweils als
ein Wert definiert (0 oder 1 und z.B. im C++ auch gern als -1 statt 1)
1 = ein Bit aktiv
-1 = alle Bits aktiv
Die Auswertung eines BOOLs sieht aber anders aus
ist 0 = False
nicht 0 = True
Tja, und nun kann es vorkommen, dass du von irgendwo ein "anderes" True bekommst und somit dein =True nicht mehr trifft.
Delphi-Quellcode:
var
B: Boolean;
begin
//B := False;
//B := True;
B := Boolean(2);
if B then
ShowMessage('1: True');
if not B then
ShowMessage('1: False');
if B = True then
ShowMessage('2: True');
if B = False then
ShowMessage('2: False');
if B <> False then
ShowMessage('3: True');
Zitat:
So grob funktioniert das jetzt sogar. Allerdings scheint meine Funktion, die mit den String mit Dezimalpunkt in ein Float umwandelt (hier im Forum gefunden) die Nachkommastellen abzuschneiden.
Was kommt wohl raus, wenn der String mal Beides drin hat?
z.B. 123.456,78
Dann knallt es.
StrToFloat hat einen Parameter FormatSettings, den sollte man verwenden, wenn man ein bestimmtes Format haben möchte, welches nicht unbedingt der aktuellen Systemsprache entspricht.
Zitat:
Delphi-Quellcode:
for j := 1 to i - 1 do
begin
if MyStrToFloat(Targets[j]) - MyStrToFloat(Targets[j - 1]) = m then
l := True
else
l := False;
end;
Wenn ich hier mal den "unnötigen" Teil entferne, wem fällt da auf, was in der Schleife schief laufen kann?
Delphi-Quellcode:
for j := 1 to i - 1 do
begin
l := MyStrToFloat(Targets[j]) - MyStrToFloat(Targets[j - 1]) = m;
end;
Delphi-Quellcode:
if i > 2 then // if i - 1 > 1 then
l := MyStrToFloat(Targets[i - 1]) - MyStrToFloat(Targets[i - 2]) = m;
Genau, alle nachfolgenden Durchläufe überschreiben diese Variable und somit wird nur das Letzte ausgewertet.
Bei z.B. 0.000000 100.000000 123456789.012 -666 300.000000 400.000000
also 0.000000 100.000000 ... irgendwas ... 300.000000 400.000000 (2 vorn und 2 hinten gleich weit entfernt)
schlägt deine Prüfschleife fehl.
Ich vermute das
else l := False;
ist so nicht gewollt und wenn es dann eh schon TRUE ist, dann kann es nicht noch TRUEr werden, also könnte man beim ersten True die Schleife abbrechen (Break).
Da Fließkommazahlen Rundungafehler enthalten können, aufgrund der binären Speicherung von dezimalen Zahlen und der gegrenzten Anzahl von Bits,
Vergleiche immer nur mit IsZero,
SameValue, CompareValue und Dergleichen, mit einem "angemessenen" Delta.