problem z funkcją frac

0
uses crt;
var d:byte;a:real;l:longint;
begin
repeat
 clrscr;
 write('podaj liczbe ');
 read(a);
 d:=9;
 l:=1000000000;
  repeat
   l:=l div 10;
   if frac(a*l)=0 then d:=d-1;
  until (frac(a*l)<>0) or (l<10);
 delay(200);
 write(a:0:d);
 repeat until keypressed;
until false;
end.

program ma na celu przypisanie zmiennej d ilosc miejsc po przecinku, jest mi to potrzebne do kalkulatora
niby dziala dobrze, ale np. po wpisaniu '12.21' pokazuje '12.21000000'
nie wiem jak rozwiazac ten problem

0

mozesz rozwiazac to np tak:

function precyzja(l:real; p:integer) : integer;
var i:integer;
    lstr:string;
begin
     str(frac(l):0:p, lstr);
     for i := p+2 downto 0 do
     if lstr[i] <> '0' then break;

     precyzja := i-2;
end;

gdzie:
l - to liczba zmienno przecinkowa
p - maksymalna precyzja do ktorej chcialbys zeby Twoja liczba byla wyswietlana

funkcja zwraca Tobie wartosc precyzji dopasowana do Twojej liczby

0

dzieki bardzo!
fukcja działa dla max przecyzji 9 ale przy liczbie ujemnej daje przecyzje o jedna za duzo np. dla -0.123 daje precyzje 4 i wyswietle -0.1230. z tym sobie poradzilem liczac funkcje dla modułu z liczby wczesniej sprawdzajac czy byla ujemna
THX

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