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