powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Расчет аннуитета, не могу решить прблему с округлением
14 сообщений из 14, страница 1 из 1
Расчет аннуитета, не могу решить прблему с округлением
    #39155084
Bie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, Ораклисты
написал вот такой код, проблема заключается в том что, не могу округлить ,помогите , спасибо всем
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
PROCEDURE Calc_annuitet
( p_Loan_amount Number --сумма кредита  1000000
 ,p_Start_Date date   -- дата расчета   07.12.2015
 ,p_maturity_date date  -- дата окончания 07.12.2016
 ,p_time_period Number  -- количесиво месяца 12 месяцев
 ,p_pay_period number    --период погашения 1 месяц
 ,p_Spread_Rate number   --процентная ставка 45
 ,P_loan_id number     -- ключ договора 1
 
)
is
 Cursor c_c(p_type varchar2) is 
 select ADD_MONTHS( trunc(p_start_date), level*p_pay_period ) as pay_date
       ,((p_time_period)/p_pay_period) qnty_pay
    from dual
   where p_type='S'
  connect by level <=((p_time_period)/p_pay_period)
   v_koef Number;
   v_per_payment Number;
   v_debt_amount Number;
   v_debt_amount_Round Number;
   v_rest  Number:=0;
   v_rest_round  Number:=0;
   v_repay Number:=0;
   
   v_round Number:=0;
   i Number:=0;
   v_end_date date:=p_start_date;
   v_interest_amount Number:=p_Loan_amount;
   v_day Number;
   v_percent Number;
   v_period Number:=0;
 begin
        Delete 
        From LOAN_SCHEDULE  
        where loan_id=P_loan_id;
       Insert into LOAN_SCHEDULE(PAY_DATE,LOAN_REST,LOAN_ID)
       values (p_start_date,p_Loan_amount,P_loan_id); 
        
     if mod((p_time_period/p_pay_period), 1)=0 then
         v_koef:=((p_spread_rate/12)*p_pay_period)/100;
         v_per_payment:=(p_Loan_amount*v_koef)/(1-power((1+v_koef), -p_time_period));
             
        FOR v_doc IN c_c('S')
         LOOP
             if v_doc.pay_date>=p_maturity_date then 
                  i:=v_round;
                 else
                  i:=0;
             end if;  
               v_day := Get_days(v_end_date, v_doc.pay_date);  --количество дней -- 30 дней
               v_percent:=Get_Percent(v_interest_amount,p_Spread_rate,v_day);  --Round(((p_amount*p_Spread_rate)/36000)*p_days,2);
               v_debt_amount:=v_per_payment-v_percent;
               v_debt_amount_Round:=Round(v_per_payment-v_percent,2);
               v_rest:=v_rest+(v_debt_amount_Round+i);
              
            insert into LOAN_SCHEDULE(PAY_DATE     -- дата погашения
                                              ,LOAN_REST  --остаток основной суммы
                                              ,LOAN_REPAY  --погашение основной суммы
                                              ,LOAN_INT   --процент
                                              ,LOAN_ID   --ключ
                                             )
                                           
                         values (v_doc.pay_date
                                ,p_Loan_amount-v_rest
                                ,v_debt_amount_Round+i
                                ,v_percent
                                ,P_loan_id);
              v_round:=v_round+(v_debt_amount-v_debt_amount_Round);   
              v_end_date:=v_doc.pay_date;
              v_interest_amount:=p_Loan_amount-v_rest;
              
         END LOOP;    
    end if;
end Calc_annuitet;
...
Рейтинг: 0 / 0
Расчет аннуитета, не могу решить прблему с округлением
    #39155095
eev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bie, авторокруглить что и до чего? или все до нуля? )
вот вчера копейки придумали.
в каждой уважающей контере есть тетя, которая денюшки считает, у неё есть тайные знания о том, что делать с остатками меньше 1 коп. и какими правилами руководствоваться при округлении.
...
Рейтинг: 0 / 0
Расчет аннуитета, не могу решить прблему с округлением
    #39155117
Bie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eevBie, авторокруглить что и до чего? или все до нуля? )
вот вчера копейки придумали.
в каждой уважающей контере есть тетя, которая денюшки считает, у неё есть тайные знания о том, что делать с остатками меньше 1 коп. и какими правилами руководствоваться при округлении.

основной долг 999999,98 чтобы равнялся 1 000 000
это ,я считаю техническая ошибка ,если разраядность до 6 уввеличить после запятой проблем нет, но учет надо 2 пояле запятой
...
Рейтинг: 0 / 0
Расчет аннуитета, не могу решить прблему с округлением
    #39155193
eev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bie, ещё раз
автортехническая ошибка превращается в правила и руководство к действию нормативами организации.
Кто-то сбрасывает остатки набежавшие с округления в итог, кто-то считает и по 9 девять после зпт., а в отчете показывает округленные. и т.д. и т.п.
Все это зависит от правил, они уже становятся алгоритмом, который реализуется. Никакой америки тут не открыто.
Вот это v_debt_amount_Round+i - чистой воды фикция.

ИМХО
Вопрос организационный и алгоритмический. Если не можете постановщику задачи (если он обладает необходимым опытом, то для него тема не нова) и руководству объяснить проблему, то вываливать это наружу не вижу смысла.

зы: это себестоимость гвоздя ещё не считали ).
...
Рейтинг: 0 / 0
Расчет аннуитета, не могу решить прблему с округлением
    #39155274
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё есть древний метод - получить погрешность того вычисления и явно сунуть её на последний (/первый) шаг
...
Рейтинг: 0 / 0
Расчет аннуитета, не могу решить прблему с округлением
    #39367521
Hrema
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно без PL/SQL:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
-- кредит с постоянной / переменной ставкой и с аннуитетом 
with p as
 ( select 1000000 as debt_amt, to_date('07.12.2015','DD.MM.RRRR') as p_start_date, 12 as debt_term from dual)
, i as
 ( --select 3 as month_till, 0.01 as ir from dual union select 6, 10 from dual union all select 12, 30 from dual
    select (select debt_term from p) as month_till, 45 as ir from dual  
 )
, r as
 ( select ir, month_till, nvl(lead (month_till,1) over (partition by null order by month_till desc),0) + 1 as month_from from i)
, rc as
 ( select g.m, r.* , 1 / (1 + r.IR /100 / 12 ) as KPCost
   from (select level as m from dual connect by level <= (select debt_term from p) ) g
  left join r on g.m between r.month_from and month_till
 ) 
, coef as 
 ( select m, IR, KPCost, exp( sum ( ln(KPCost) ) over (ORDER BY m RANGE UNBOUNDED PRECEDING)) as sumKPCost from rc order by m
 )
, t (m, ir, main_debt, ttl_pay, profit_pay) as
 ( select  1 as m
         , (select to_char(ir,'999D99') || '%' from r where 1 between r.month_from and r.month_till) as ir
         , (select debt_amt from p) as main_debt
         , (select debt_amt / (select sum ( sumKPCost ) as MonthlyPay from coef) from p ) as ttl_pay
         , (select debt_amt from p)*(select ir/100/12 from r where 1 between r.month_from and r.month_till) as profit_pay 
   from dual
   union all
   select  m+1 as m
         , (select to_char(ir,'999D99') || '%' from r where m+1 between r.month_from and r.month_till) as ir   
         , main_debt-ttl_pay+profit_pay as main_debt
         , ttl_pay
         , (main_debt-ttl_pay+profit_pay)*(select ir/100/12 from r where m+1 between r.month_from and r.month_till) as profit_pay
   from t where m < (select debt_term from p)
 )
, ttl as 
(
 select add_months((select p_start_date from p),m) as pay_date, ttl_pay, profit_pay, ttl_pay-profit_pay as main_pay, main_debt-ttl_pay+profit_pay as rem_debt_amt from t order by 1 
)
select to_char(p_start_date,'DD.MM.RRRR') as "Дата платежа", 0 as "Платеж за период", 0 as "Вознаграждение", 0 as "Основной долг", debt_amt as "Остаток задолженности" from p
union all
select to_char(pay_date,'DD.MM.RRRR'), round(ttl_pay,2), round(profit_pay,2), round(main_pay,2), round(rem_debt_amt,2) from ttl
union all
select 'Итого', round(sum(ttl_pay),2), round(sum(profit_pay),2), round(sum(main_pay),2), null from ttl;



+ будет работать и для переменной процентной ставки, если расскомментарить в подзапросе i нужный select и закомментарить ненужный.
...
Рейтинг: 0 / 0
Расчет аннуитета, не могу решить прблему с округлением
    #39368252
Xdredd.vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bie,
У нас этот вопрос решился округлением вверх до рубля (чтобы клиенты копейки не таскали), а в последнем платеже сумма погашения ссуды это не (аннуитет - нак.%), а остаток ссудной задолженности. То есть последний платеж считается как сумма ссуды и нак.%, и он всегда меньше аннуитета так как бы округляли вверх.
...
Рейтинг: 0 / 0
Расчет аннуитета, не могу решить прблему с округлением
    #39368254
Xdredd.vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HremaМожно без PL/SQL:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
-- кредит с постоянной / переменной ставкой и с аннуитетом 
with p as
 ( select 1000000 as debt_amt, to_date('07.12.2015','DD.MM.RRRR') as p_start_date, 12 as debt_term from dual)
, i as
 ( --select 3 as month_till, 0.01 as ir from dual union select 6, 10 from dual union all select 12, 30 from dual
    select (select debt_term from p) as month_till, 45 as ir from dual  
 )
, r as
 ( select ir, month_till, nvl(lead (month_till,1) over (partition by null order by month_till desc),0) + 1 as month_from from i)
, rc as
 ( select g.m, r.* , 1 / (1 + r.IR /100 / 12 ) as KPCost
   from (select level as m from dual connect by level <= (select debt_term from p) ) g
  left join r on g.m between r.month_from and month_till
 ) 
, coef as 
 ( select m, IR, KPCost, exp( sum ( ln(KPCost) ) over (ORDER BY m RANGE UNBOUNDED PRECEDING)) as sumKPCost from rc order by m
 )
, t (m, ir, main_debt, ttl_pay, profit_pay) as
 ( select  1 as m
         , (select to_char(ir,'999D99') || '%' from r where 1 between r.month_from and r.month_till) as ir
         , (select debt_amt from p) as main_debt
         , (select debt_amt / (select sum ( sumKPCost ) as MonthlyPay from coef) from p ) as ttl_pay
         , (select debt_amt from p)*(select ir/100/12 from r where 1 between r.month_from and r.month_till) as profit_pay 
   from dual
   union all
   select  m+1 as m
         , (select to_char(ir,'999D99') || '%' from r where m+1 between r.month_from and r.month_till) as ir   
         , main_debt-ttl_pay+profit_pay as main_debt
         , ttl_pay
         , (main_debt-ttl_pay+profit_pay)*(select ir/100/12 from r where m+1 between r.month_from and r.month_till) as profit_pay
   from t where m < (select debt_term from p)
 )
, ttl as 
(
 select add_months((select p_start_date from p),m) as pay_date, ttl_pay, profit_pay, ttl_pay-profit_pay as main_pay, main_debt-ttl_pay+profit_pay as rem_debt_amt from t order by 1 
)
select to_char(p_start_date,'DD.MM.RRRR') as "Дата платежа", 0 as "Платеж за период", 0 as "Вознаграждение", 0 as "Основной долг", debt_amt as "Остаток задолженности" from p
union all
select to_char(pay_date,'DD.MM.RRRR'), round(ttl_pay,2), round(profit_pay,2), round(main_pay,2), round(rem_debt_amt,2) from ttl
union all
select 'Итого', round(sum(ttl_pay),2), round(sum(profit_pay),2), round(sum(main_pay),2), null from ttl;



+ будет работать и для переменной процентной ставки, если расскомментарить в подзапросе i нужный select и закомментарить ненужный.

Круть, утащил к себе в коллекцию...
...
Рейтинг: 0 / 0
Расчет аннуитета, не могу решить прблему с округлением
    #39368306
Фотография RA\/EN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Xdredd.vlBie,
У нас этот вопрос решился округлением вверх до рубля (чтобы клиенты копейки не таскали), а в последнем платеже сумма погашения ссуды это не (аннуитет - нак.%), а остаток ссудной задолженности. То есть последний платеж считается как сумма ссуды и нак.%, и он всегда меньше аннуитета так как бы округляли вверх.
Фигасе вы наглые. Чтоб клиенты не таскали копейки, берете с них лишние деньги. Как это бухгалтерия потом проводит, интересно?
В магазинах округляют вниз при оплате наличкой, а некоторые даже при оплате картой, т.к. округление делается до того, как выбирается тип оплаты (Лента, например).
...
Рейтинг: 0 / 0
Расчет аннуитета, не могу решить прблему с округлением
    #39368327
legg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RA\/EN,

Они в последнем платеже компенсируют.
...
Рейтинг: 0 / 0
Расчет аннуитета, не могу решить прблему с округлением
    #39368452
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RA\/EN,
теперь я понял почему последний ипотечный платеж в сбере всегда меньше среднемесячного...))
...
Рейтинг: 0 / 0
Расчет аннуитета, не могу решить прблему с округлением
    #39368593
Фотография RA\/EN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leggRA\/EN,

Они в последнем платеже компенсируют.
У меня оба раза остаток шел N+1 месяцем. Т.е. от выдачи до первого платежа - проценты только, потом - аннуитет одинаковый и последним месяцем - накопившийся должок. Если по формуле аннутитет получался, допустим, 330.156, то платеж был 330.15, а все это 0.006 накапливались и при закрытии шли отдельным платежем (кто-нибудь, интересно, гасит ипотеку строго по графику?).
...
Рейтинг: 0 / 0
Расчет аннуитета, не могу решить прблему с округлением
    #39369485
Xdredd.vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RA\/ENXdredd.vlBie,
У нас этот вопрос решился округлением вверх до рубля (чтобы клиенты копейки не таскали), а в последнем платеже сумма погашения ссуды это не (аннуитет - нак.%), а остаток ссудной задолженности. То есть последний платеж считается как сумма ссуды и нак.%, и он всегда меньше аннуитета так как бы округляли вверх.
Фигасе вы наглые. Чтоб клиенты не таскали копейки, берете с них лишние деньги. Как это бухгалтерия потом проводит, интересно?
В магазинах округляют вниз при оплате наличкой, а некоторые даже при оплате картой, т.к. округление делается до того, как выбирается тип оплаты (Лента, например).

Прекрасно проводят.
1) Сумма платежа находится на счете 40817 (средства ФЛ), сумма равна округленной сумме аннутитета.
2) Первая проводка дт40817 - кт47427 на сумму накопленных процентов
3) Вторая дт40817-кт4550_ на сумму которая осталась на счете 40817 после первой проводки и при этом сумма двух проводок не больше суммы округленного аннуитета.

Причем клиентам даже выгоднее так как ссуда в этом случае гасится быстрее и процентов в дальнейшем накапливается меньше( правда выгода эта 0.0000001%).
...
Рейтинг: 0 / 0
Расчет аннуитета, не могу решить прблему с округлением
    #39369738
Фотография RA\/EN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Xdredd.vlRA\/ENпропущено...

Фигасе вы наглые. Чтоб клиенты не таскали копейки, берете с них лишние деньги. Как это бухгалтерия потом проводит, интересно?
Прекрасно проводят.
...
Причем клиентам даже выгоднее так как ссуда в этом случае гасится быстрее и процентов в дальнейшем накапливается меньше( правда выгода эта 0.0000001%).
Да понятно, что клиента вы не обманываете, и график платежей он подписывает, но если бы не подписывал - это было бы, наверное, принудительное частичное досрочное погашение без заявления клиента (в особо мелком размере )
А по части экономии - можно удивить клиента и сэкономить ему проценты за 10 лет, потребовав полного досрочного через месяц после выдачи. Вот он обрадуется
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Расчет аннуитета, не могу решить прблему с округлением
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]