Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Meni neobjašnjivo ponašanje...

[es] :: Pascal / Delphi / Kylix :: Meni neobjašnjivo ponašanje...

[ Pregleda: 2946 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Meni neobjašnjivo ponašanje...15.12.2008. u 23:08 - pre 186 meseci
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...

 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Meni neobjašnjivo ponašanje...15.12.2008. u 23:11 - pre 186 meseci
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?
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Meni neobjašnjivo ponašanje...15.12.2008. u 23:26 - pre 186 meseci
Riješih problem:

dovoljno je definirati varijablu kao Extended.... mada mi to nema smisla kada je varijabli dodijeljena točna vrijdenost.
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Meni neobjašnjivo ponašanje...15.12.2008. u 23:35 - pre 186 meseci
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...
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.fibertel.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Meni neobjašnjivo ponašanje...15.12.2008. u 23:43 - pre 186 meseci
Code:

fMater :=StrToFloat(fSql.FieldByName('mater').AsString);

Tko leti vrijedi
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Meni neobjašnjivo ponašanje...15.12.2008. u 23:49 - pre 186 meseci
Da, tako radi, ali zašto ne i kao numeric?
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.fibertel.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Meni neobjašnjivo ponašanje...16.12.2008. u 02:08 - pre 186 meseci
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.
Tko leti vrijedi
 
Odgovor na temu

obucina

Član broj: 38191
Poruke: 723

Jabber: obucina


+7 Profil

icon Re: Meni neobjašnjivo ponašanje...16.12.2008. u 07:34 - pre 186 meseci
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.
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Meni neobjašnjivo ponašanje...16.12.2008. u 07:39 - pre 186 meseci
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....
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Meni neobjašnjivo ponašanje...16.12.2008. u 14:37 - pre 186 meseci
Za upoređivanje decimalnih brojeva koristi CompareValue i SameValue.
 
Odgovor na temu

obucina

Član broj: 38191
Poruke: 723

Jabber: obucina


+7 Profil

icon Re: Meni neobjašnjivo ponašanje...16.12.2008. u 23:37 - pre 186 meseci
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.
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Meni neobjašnjivo ponašanje...17.12.2008. u 08:00 - pre 186 meseci
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...
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Meni neobjašnjivo ponašanje...

[ Pregleda: 2946 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.