il problema e' proprio questo...la perdita di precisione.

io devo calcolare il totale di valori quali imponibile e imposta.

nel programma in delphi questi 2 fields sono fields calcolati, ed io per ogni record eseguo il calcolo:
codice:
procedure TFrmMovimenti.IBDataSet1CalcFields(DataSet: TDataSet);
begin
 with IBDataSet1 do
  begin
  FieldByName('IMPONIBILE').AsFloat := (FieldByName('QUANTITA').AsFloat * FieldByName('PREZZO').AsFloat) - ((FieldByName('QUANTITA').AsFloat * FieldByName('PREZZO').AsFloat) * FieldByName('SCONTO').AsFloat /100);
  FieldByName('IMPOSTA').AsFloat := FieldByName('IMPONIBILE').AsFloat * FieldByName('IVA').AsFloat /100 ;
  FieldByName('TOTALE').AsFloat := FieldByName('IMPONIBILE').AsFloat + FieldByName('IMPOSTA').AsFloat;
  end;
end;
ad esempio, il fields imposta e' definito numeric 9,3 e quindi viene automaticamente arrotondato alla terza cifra decimale, e questo arrotondamento avviene singolarmente per ogni record di dettaglio_movimento.

nella stored procedure calcolo i totali in questo modo:
codice:
CREATE PROCEDURE TOTALI_DET (
    IDMOVIMENTI INTEGER)
RETURNS (
    IMPONIBILE NUMERIC(15,3),
    IMPOSTA NUMERIC(15,3),
    TOTALE NUMERIC(15,3))
AS
begin
  /* Procedure Text */
SELECT 
SUM((quantita*prezzo)-(quantita*prezzo*sconto/100)),
SUM((quantita*prezzo)-(quantita*prezzo*sconto/100)*iva/100),
SUM(((quantita*prezzo)-(quantita*prezzo*sconto/100))+((quantita*prezzo)-(quantita*prezzo*sconto/100))*iva/100)
FROM movimenti_dettaglio
where id_movimenti = :idmovimenti
INTO :imponibile, :imposta, :totale;
suspend;
end
questo fa si, che l'arrotondamento non avviene singolarmente per ogni record, bensi solo alla fine della SUM, e quindi ottengo dei totali che possono essere diversi dalla somma delle cifre che effettivamente visualizzo.

cosa mi consigli di fare?

ps.: quando mi hai detto di utilizzare fields numeric invece di double intendevi come dovevo dichiarare le variabili di RETURNS della stored NUMERIC?

grazie