Добавить комментарий

Изображение пользователя st.

Точность

Замечание в принципе справедливое, порядок округлений и требуемая точность зависят от локально принятых правил ведения финансовых операций (классика жанра "в отчете НДС не "бьётся" по строкам и столбцам"). Тем не менее, пара скрытых разрядов, как минимум, не мешает, а во многих случаях и помогает.

Пример для PostgreSQL.

CREATE TABLE t1 (
  id int NOT NULL PRIMARY KEY,
  amt1 numeric(18,2),
  nds1 numeric(18,2),
  amt1_nds numeric(18,2),
  amt2 numeric(18,4),
  nds2 numeric(18,4),
  amt2_nds numeric(18,4)
);
 
INSERT INTO t1 (id, amt1_nds) VALUES
(1, 1.),
(2, 2.),
(3, 3.),
(4, 4.),
(5, 5.),
(6, 6.);
 
UPDATE t1 SET amt2_nds = amt1_nds;
 
UPDATE t1
SET nds1 = amt1_nds - (amt1_nds / 1.18),
    amt1 = amt1_nds / 1.18,
    nds2 = amt2_nds - (amt2_nds / 1.18),
    amt2 = amt2_nds / 1.18;
 
SELECT round(SUM(amt1) * 0.18, 2)      AS nds1_1,
       round(SUM(nds1), 2)             AS nds1_2,
       round(SUM(amt1) * 1.18, 2)      AS amt1_nds1,
       round(SUM(amt1) + SUM(nds1), 2) AS amt1_nds2,
       round(SUM(amt1_nds), 2)         AS amt1_nds3,
       round(SUM(amt2) * 0.18, 2)      AS nds2_1,
       round(SUM(nds2), 2)             AS nds2_2,
       round(SUM(amt2) * 1.18, 2)      AS amt2_nds1,
       round(SUM(amt2) + SUM(nds2), 2) AS amt2_nds2,
       round(SUM(amt2_nds), 2)         AS amt2_nds3
FROM t1;

Результат:

nds1_1 nds1_2 amt1_nds1 amt1_nds2 amt1_nds3 nds2_1 nds2_2 amt2_nds1 amt2_nds2 amt2_nds3
---------------------------------------------------------------------------------------
  3.20   3.21     20.99     21.00     21.00   3.20   3.20     21.00     21.00     21.00