[ franjo_tahi @ 15.12.2008. 23:08 ] @
Može li mi tko ovo objastniti... u čemu je problem?
ovo je izdvojen dio složenije procedure, podatke dobivam iz baze. U glavnom, vrijednosti se postave kako sam ovdje napisao, a niti ova porocedura se ne izvrši kako treba.

Code:

procedure TForm1.Button1Click(Sender: TObject);
var fKs, fMater, g: double;
begin
   fKS := 0;
   fMater := 2.2;
   G := 10;
   if (fMater = 1) then begin
      if G < 120 then fKS := 0.583 else fKS := 70/G;
   end;
   if (fMater = 2.1) then begin
      if G < 100 then fKS := 0.7 else fKS := 70/G;
   end;
   if (fMater = 2.2) then begin
      if G < 80 then fKS := 0.875 else fKS := 70/G;
   end;
   if (fMater = 3.1) then begin
      if G < 80 then fKS := 0.875 else fKS := 70/G;
   end;
   if ((fMater >= 3.2) and (fMater <= 4)) then begin
      if G < 60 then fKS := 1.167 else fKS := 70/G;
   end;
   if (fMater = 5) then begin
      if G < 40 then fKS := 1.75 else fKS := 70/G;
   end;
   if (fMater = 6) then begin
      if G < 20 then fKS := 3.5 else fKS := 70/G;
   end;
   ShowMessage(FloatToStr(fKS));
end;


zašto ne prepoznaje "if fMater = 2.2" kad je eksplicitno zadana vrijednost? Pratim u debuger-u, varijabli fKS nikada ne dodijeli vrijednost...

[ franjo_tahi @ 15.12.2008. 23:11 ] @
E, ovo nema smisla! Ovako radi:

Code:

if (fMater >= 2.2) and (fMater <= 2.200000000000001) then begin
...


kako je to moguće kada fMater nije dobijen računskom operacijom koja bi prouzrokovala decimale?
[ franjo_tahi @ 15.12.2008. 23:26 ] @
Riješih problem:

dovoljno je definirati varijablu kao Extended.... mada mi to nema smisla kada je varijabli dodijeljena točna vrijdenost.
[ franjo_tahi @ 15.12.2008. 23:35 ] @
Malo prerano se poveselih.
Radi ako se eksplicitno zada vrijednost. U programu gdje se vrijdnost čita iz baze, ne radi.

fMater :=fSql.FieldByName('mater').Value;
ili
fMater :=fSql.FieldByName('mater').AsFloat;

do duše, u bazi mi je definiran field kao VarChar(3) u koji su upisani samo numerici...
[ kiklop74 @ 15.12.2008. 23:43 ] @
Code:

fMater :=StrToFloat(fSql.FieldByName('mater').AsString);
[ franjo_tahi @ 15.12.2008. 23:49 ] @
Da, tako radi, ali zašto ne i kao numeric?
[ kiklop74 @ 16.12.2008. 02:08 ] @
zato sto je polje u bazi string. string mora da se naknadno konvertuje u numeric/float uz pomoc funkcije strtofloat. To klasa ne radi automatski ako si na to mislio.
[ obucina @ 16.12.2008. 07:34 ] @
Brojevi sa pokretnim zarezom su neprecizni, kada im dodelis vrednost nikada nemoj pretpostavljati da su oni zaista dobili tu vrednost koju si im dodelio. Tako npr 0 mozda nije 0, vec 0,000000000000000001, 134,45 je mozda 134.4498989989989899999 i tako... Ako vec ne mozes da izbegnes poredjenje float vrednosti, radi ili sa opsegom (>= i < ili > i <=), ili ih mnozi sa 10, 100, 1000, koliko ti vec decimala treba i pretvori u integer.
[ franjo_tahi @ 16.12.2008. 07:39 ] @
Kako ne radi automatski? Možeš reči:

Code:

fSql.FieldByName('mater').AsFloat;


to uredno vrati double, tj. float.

Nejasno mi je zašto to nije "čist broj". U bazi je upisano "2.2", a on očito vrati nešto kao "2.20000000000001". Pokušat ću konverirati field u bazi u numeric pa ću vidjeti što se tada događa. Vjerojatno je stvar internog načina čuvanja broja jer ni explicitno zadana vrijednost ne radi dobro ako je varijabla tipa double, a za extended je ok. Međutim, ne postoji (bar koliko znam) metoda koja će vratiti extended, već samo float/double (.AsFloat).

obucina i ja smo pisali u isto vrijeme....
[ savkic @ 16.12.2008. 14:37 ] @
Za upoređivanje decimalnih brojeva koristi CompareValue i SameValue.
[ obucina @ 16.12.2008. 23:37 ] @
Citat:
franjo_tahi: Nejasno mi je zašto to nije "čist broj". U bazi je upisano "2.2", a on očito vrati nešto kao "2.20000000000001". Pokušat ću konverirati field u bazi u numeric pa ću vidjeti što se tada događa. Vjerojatno je stvar internog načina čuvanja broja jer ni explicitno zadana vrijednost ne radi dobro ako je varijabla tipa double, a za extended je ok.


Uzmi neku knjigu o arhitekturi racunara i citaj o brojevima sa pokretnim zarezom, pa ce ti biti jasno.
Nije ni za extended ok, jer je i on tip broja sa pokretnim zarezom. Extended samo moze da pokrije vise "tacnih slucajeva" od float i double. Npr, pokrice 2,4 ce zapisati tacno kao 2,4, ali nece 2,000000000000000000000000000000005.
[ franjo_tahi @ 17.12.2008. 08:00 ] @
Hvala na odgovorima.
Jasno je o čemu se radi, školica je davno bila pa se ponešto i zaboravilo. Nevjerojatno mi je da nisam naišao na taj problem, jer da jesam, sjetio bih se! Vjerojatno zbog tipa programa koje radim...