nie sprawdza warunku IF

0

Witam,
mam w tablicy wartości pobrane z Editów, suma Editów ma wynosić 100 jeśli wartości są poprawnie wykonane. Jest to warunek dla dalszych obliczeń. Problem polega na tym, że w tablicy jest 100 a IF p[i] = 100 THEN ... nie wykonuje instrukcji. Co ciekawe, czasem ten warunek się wykona przy innej tablicy.
Oto fragment kodu:

p[1] := StrToFloat(Edit16.Text);
p[2] := p[1] + (StrToFloat(Edit15.Text));
p[3] := p[2] + (StrToFloat(Edit14.Text));
p[4] := p[3] + (StrToFloat(Edit13.Text));
p[5] := p[4] + (StrToFloat(Edit12.Text));
p[6] := p[5] + (StrToFloat(Edit11.Text));
p[7] := p[6] + (StrToFloat(Edit10.Text));
p[8] := p[7] + (StrToFloat(Edit9.Text));
p[9] := p[8] + (StrToFloat(Edit8.Text));
p[10] := p[9] + (StrToFloat(Edit7.Text));
p[11] := p[10] + (StrToFloat(Edit6.Text));
p[12] := p[11] + (StrToFloat(Edit5.Text));
p[13] := p[12] + (StrToFloat(Edit4.Text));
p[14] := p[13] + (StrToFloat(Edit3.Text));
p[15] := p[14] + (StrToFloat(Edit2.Text));
p[16] := p[15] + (StrToFloat(Edit1.Text));

fl := false;
for i := 1 to 16 do
    if p[i] = 100 then
      begin
        fl := true;
    end;
0

Przydałyby się przykładowe dane, taki dla których według ciebie to działa i takie gdy nie.

0

Z tego co widzę to ta p to tablica gdzie wartości są z przecinkiem. Może końcowy wynik to 100.01 lub jakiś kawałek po przecinku... Może wyświetlasz tylko całości bez przecinka dlatego może być sto ale faktycznie jest nieco więcej...

0
angel2953 napisał(a)

Z tego co widzę to ta p to tablica gdzie wartości są z przecinkiem. Może końcowy wynik to 100.01 lub jakiś kawałek po przecinku... Może wyświetlasz tylko całości bez przecinka dlatego może być sto ale faktycznie jest nieco więcej...

Poza tym te obliczenia można zmieścić w jednej linijce kodu :/

0

generalnie nie chodzi o optymalizację kodu. Jest to pisane w potrzebie chwili. Odnośnie danych: jeśli wprowadzone są całkowite w Edity to działa ok natomiast przy real występuje ten problem. Dane to:
10.2; 20.2; 4.2; 3.4; 3.6; 6.3; 3; 3.8; 5.2; 5.3; 4; 4; 5.6; 3.8; 0.8; 16.6 gdzie 16.6 jest pierwszym elementem tablicy a 10.2 ostatnim. Suma wynosi dokładnie 100. W tablicy też wyświetla elementy z dokł. do 0.1.

jest jeszcze jedno - teraz zauważyłem:
jeśli do editów wpiszę wszystkie wartości z przecinkiem ale całokowite (10.0; 4.0 itd) to liczy, jeśli część dziesiętna różni się do zera maksymalnie w 5 liczbach też działa, od 6 liczb z częścią dziesiętną różną od zera - błąd.
Wygląda, że problem będzie przy konwersji typów. czy p[i] przerobić na string i wtedy porównywać ze '100' ??

0

Uroki liczb zmiennoprzecinkowych. Szansa, że trafisz idealne 100 jest zerowa. Pamietaj, że masz precyzję kilkunastu cyfr po przecinku. Aby mieć pewność zrób coś na wzór if InRange(p[i], 99.99999999, 100.000000001) then

0

dokładnie tak. z zakresem jeszcze nie próbowałem ale przerobienie p[i] na string i porównanie do '100' pomogło. Terez testuję czy we wszystkich przypadkach :)
Dziękuję wszystkim, temat uważam za zamknięty.

0

A wlep tam takie coś:

for i := 1 to 16 do
      begin
        ShowMessage(p[i]); // wyświetla komunikat z wartością tablicy p o indexie i
    end;

Dzięki temu będziesz widział jaką wartość ma p[i].

1 użytkowników online, w tym zalogowanych: 0, gości: 1