Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Pretypovanie real na integer mimo trunc - Delphi

Ahojte,
pme: Niekedy naozaj zaokrúhliť treba ale niekedy práveže nie. Konkrétne v aplikácii, na ktorej pracujem, ide o prezeraniea vyhodnocovanie plochy, ktorá je rozdelená na menšie sektory, pričom hranice sektorov sú určené celými číslami, takže 12.75 spadá ešte do jedného ale 13 alebo 13.12 už do iného sektora, takže vyhodnotenie bude nesprávne. Problematika mojej aplikácie je trochu zložitejšia, preto tu nechcem rozpútavať debatu o tom, ako riešiť problém vyhodnocovania. Šlo mi čiste o tie prípady, kedy trunc(12,75) nevráti 12 ako je napríklad ten z môjho pôvodného príspevku. Kým trunc(-16275) vráti -16275 konštrukcia
var a:string;x,y:real;i:integer;
begin
a:='-16.275';
x:= strtofloat(ansireplacetext( a,'.',','));
y:=x*1000;
i:=trunc(y);
end;
vráti -16274 a podobný výsledok som spozoroval aj v niekolkých ďalších prípadoch, hoci v 98% iných výskytoch trunc sa toto nedeje. Je mi jasné čo píše MM o reálnych číslach, no práve preto som položil otázku, ako spolahlivo dosiahnuť správny výsledok. Round zaokrúhluje k najbližšiemu celému číslu a v helpe som nevidel možnosť vynútiť zaokrúhlenie iba smerom nadol či nahor. Zaujímavé je aj to, že v mojej vyššie uvedenej konštrukcii, kde mám pôvodne string s číslom '16275' a ten cez strtofloat prevediem na real je výsledkom premenná y, ktorá po výpise cez showmessage(floattostr(y)) vypíše 16275.000000 a po prevedení cez trunc už 16274. Naozaj neviem prečo to tak je, no zbadal som to aj pri niektorých iných číslach, hoci ide možno o mizivé percento no predsa.
wikan: zápis trunc(abs(y)*sign(y) vracia kvôli trunc ten istý chybný výsledok, pretože trunc vráti v tomto prípade nesprávnu hodnotu aj keď argumentom je to isté ale kladné číslo.

Reakce na odpověď

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny