Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кредитный калькулятор, неправильно считает 
V
    Опции темы
kr3v3tkus
Дата 5.10.2008, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 8.3.2008

Репутация: нет
Всего: 1



Помогите пожалуйста разобраться с калькулятором - рассчитываю аннуитет, происходит stack overflow. Если ставить маленькие числа - результаты выходят неправельные. Это изза неправильного выбора типов данных, или я ещё накосячил в формулах? Пожалуйста, подскажите несложную реализацию для работы с большими числами.
Для проверки формул в атаче реализация в екселе и формула ежемесячного платежа

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  1.rar 208,72 Kb
PM MAIL   Вверх
volvo877
Дата 5.10.2008, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



На самом деле у тебя при нажатии на кнопку выполнялись лишние действия, и все вылетало из-за несоответствия DecimalSeparator-а. Но эти преобразования не нужны, вот так может выглядеть эта самая процедура:

Код
procedure TFCalc.BRaschClick(Sender: TObject);

  function PMT(IR, NP, PV: real): real;
  begin
    result := (PV * IR) / (1 - power(1 + IR, -NP));
  end;

var
  sum, stavka: extended;
  month: integer;
  Ejrasch: extended;
begin
  sum := StrToFloat(ESum.Text);
  stavka := StrToFloat(EStavka.Text) * 0.01;
  month := StrToInt(Emonth.Text);


  if RBAn.Checked=true then begin   // цикл аннуитетного расчёта
    Ejrasch := Pmt(stavka / 12, month, sum);
    Annuite(sum, stavka, Ejrasch, month);
  end

  else begin    // цикл дифференциального расчёта

  end;

end;
Кстати, в Annuite тоже надо внести несколько изменений:
Код
procedure Annuite(summa, stavka, mesplatej: real; month: integer);
var
 i: integer;
 ostn, ostk, vplpr, pgdolg: real;
begin
  FCalc.SG.RowCount := month + 1; // А то вдруг я введу 60, как в примере?
  
  for i := 1 to month do begin
    if i = 1 then ostn := summa else ostn := ostk; // Здесь была опечатка, надо if i = 1
    vplpr := ostn * stavka / 12;
    pgdolg := mesplatej - vplpr;
    ostk := ostn - pgdolg;

    FCalc.SG.Cells[0,i]:= inttostr(i); // <--- (2) - выводить текущий месяц, а не сколько всего месяцев
    FCalc.SG.Cells[1,i]:= floattostr(vplpr);
    FCalc.SG.Cells[2,i]:= floattostr(pgdolg);
    FCalc.SG.Cells[3,i]:= floattostr(mesplatej);
    FCalc.SG.Cells[4,i]:= floattostr(ostn);
    FCalc.SG.Cells[5,i]:= floattostr(ostk);

  end;

end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0685 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.