Hallo,
habe folgendes Problem.
es werden zwei Zahlen im Edit eingegeben, die werden halbiert und auf zwei Kommastellen gerundet.
Dann folgt eine IF Anweisung, die nicht so richtig funktioniert.
var x,y:real;
r2:=RoundTo(x / y,-2);
IF R2 =0.49 THEN BEGIN Faktor1:=2.168 END;
IF R2 =0.50 THEN BEGIN Faktor1:=2.1861 END;
IF R2 =0.51 THEN BEGIN Faktor1:=2.2041 END;
Also bei r2=0,5 zeigt mir Label den richtigen Faktor1, bei den anderen nicht.
HAt jemmand eine Idee was falsch sein könnte. Ich vermute, dass abgerundete Zahl im "System" noch komplett besteht und daher erkennt IF die nicht. Aber wie macht man es besser?
Falsch ist deine Vorstellung von der Vergleichbarkeit von Dezimalbrüchen.
Abgesehen von Potenzen von 2 können Dezimalbrüche bei Realzahlen nicht exakt dargestellt werden.
Sei x=49 und y=100 dann wird nach r2:=RoundTo(x / y,-2) r2 zwar einen Wert haben, der nahe bei 0.49 liegt, aber eben nicht exakt.
Der Vergleich wird über die FPU durchgeführt und in der sehen die Zahlen so aus
r2 = 3FFD FAE1 47AE 147A E147
0.49 = 3FFD FAE1 47AE 147A E148
Beachte die letzte Ziffer in beiden Werten.
Abhilfe:
Entweder
if SameValue(0.49,r2) then …
oder
du definierst r2 als integer, rechnest r2:=Round(x*100/y) und testest mit
if r2=49 then …