Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > работа с double


Автор: dize 25.8.2009, 07:32
Возникла необходимость работы с дробными числами, а именно: вводимые числа в edit1 и edit3 могут быть не целые. Причем edit3 принимает участие в формуле в качестве переменной stoimost. kolvo[i] должно округляться до наименьшего. Также содержимое edit3 должно заноситься в базу с 2 знаками после запятой. База данных access2000, в которой поле Tek_sredstva(в формуле sredstva) представлено в виде "двойное с плавающей точкой" и точность установлена до 2 знаков. 

Код


var
  new_order: Tnew_order;
  query: array[0..2] of string;  
  queryq: array[0..1] of double;

implementation

{$R *.dfm}

procedure Tnew_order.Button1Click(Sender: TObject);
var
  i,count:integer;
  sql,id_paper,class_code:string;
  id_clients: array of string;
  kolvo: array of double;
  procent,stoimost,sredstva:double;

begin
  if radiobutton1.Checked=true then query[2]:='B'
  else query[2]:='S';

  if edit3.Text='' then
  begin
    ShowMessage('...');
    exit;
  end
  else queryq[0]:= strtofloat(edit3.Text);


  if RadioButton3.Checked=true then
  begin
    if edit1.Text='' then
     begin
       ShowMessage('...');
        exit;
     end
     else queryq[1]:= strtofloat(edit1.Text);
  end;

  if RadioButton4.Checked=true then
  begin
  ADOQ_new.Close;
  ADOQ_new.SQL.Clear;
  ADOQ_new.SQL.Add('SELECT Dengi.Tek_sredstva');
  ADOQ_new.SQL.Add('FROM Dengi INNER JOIN groups ON Dengi.id_group=groups.id_group');
  ADOQ_new.SQL.Add('WHERE groups.group="'+query[0]+'"');
  ADOQ_new.Open;

  SetLength(kolvo,ADOQ_new.RecordCount);
  i:=0;
  procent:= strtofloat(Edit2.text);
  stoimost:= strtofloat(Edit3.text);
  while (not ADOQ_new.Eof) do
    begin
        sredstva := strtofloat(ADOQ_new.FieldByName('Tek_sredstva').AsString);
        kolvo[i] := round(sredstva*procent/100/stoimost);
        ADOQ_new.Next();
        i:=i+1;
    end; 
  end; 

  if (query[0]='') or (query[1]='') then
  begin
    ShowMessage('...');
    exit;
  end;

..................

  for i:=0 to count do
  begin
    if RadioButton3.Checked=true then sql:= 'INSERT INTO New_Order ( Account, Kod_klienta, Type, CLASSCODE, Kod_bumagi, [Action], OPERATION, Order_Price, Quantity, Reverse, Ostatki, Cena_ispoln, Stop_cena ) VALUES ("L01-00000F00", "'+id_clients[i]+'", "L", "'+class_code+'", "'+id_paper+'", "NEW_ORDER", "'+query[2]+'", "'+floattostr(queryq[0])+'", "'+floattostr(queryq[1])+'", "0", "0", "0", "0")'
    else sql:= 'INSERT INTO New_Order ( Account, Kod_klienta, Type, CLASSCODE, Kod_bumagi, [Action], OPERATION, Order_Price, Quantity, Reverse, Ostatki, Cena_ispoln, Stop_cena ) VALUES ("L01-00000F00", "'+id_clients[i]+'", "L", "'+class_code+'", "'+id_paper+'", "NEW_ORDER", "'+query[2]+'", "'+floattostr(queryq[0])+'", "'+floattostr(kolvo[i])+'", "0", "0", "0", "0")';


    ADOQ_new.Close;
    ADOQ_new.SQL.Clear;
    ADOQ_new.SQL.Text:=sql;
    ADOQ_new.ExecSQL;
  end;
end;

Автор: Romikgy 25.8.2009, 09:51
и где вопрос ?

Автор: dize 25.8.2009, 10:51
Насколько я понял access понимает разделитель только в виде точки. Вопрос в том, как сделать принудительное преобразование введонного числа edit3 в число с разделителем в виде точки. К тому же запись в бд идет в виде числа с запятой, а он почему-то округляет по принципу round.

Автор: Romikgy 25.8.2009, 13:45
DecimalSeparator 
Цитата(dize @  25.8.2009,  09:51 Найти цитируемый пост)
К тому же запись в бд идет в виде числа с запятой, а он почему-то округляет по принципу round.

а как хотели ?

Автор: dize 26.8.2009, 20:39
До 4 знаков после запятой. Уже разобрался.

Автор: Romikgy 26.8.2009, 23:08
тогда закрывай тему

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)