static void Main(string[] args)
        {
            var parameters = new CreditParameters
            {
                 CreditValue = 196879.95d,
                 InstallmentsCount = 48,
                 InstallmentsPerYear = 12,
                 WiborRate = 0.0164d,
                 Start = 0.075d,
                 End = 0.080d,
                 Delta = 0.0005d
            };

            var tasks = new List<Task>();
            for (var i = parameters.Start; i <= parameters.End; i += parameters.Delta)
            {
                var margin = i;
                tasks.Add(Task.Factory.StartNew(() =>
                    {
                        CalculateInstallmentValue(parameters, margin);
                    }));
            }

            Task.WaitAll(tasks.ToArray());

            Console.WriteLine("Press any key to continue...");
            Console.ReadKey(true);
        }
 static void CalculateInstallmentValue(CreditParameters parameters, double m)
 {
     //Console.WriteLine(String.Format("Margin: {0:F4}", margin));
     var q = 1.0d + (parameters.WiborRate + m) / parameters.InstallmentsPerYear;
     var w1 = Math.Pow(q, parameters.InstallmentsCount);
     var w2 = Math.Pow(q, parameters.InstallmentsCount) - 1.0d;
     var r = parameters.CreditValue * w1 * (q - 1) / w2;
     Console.WriteLine(String.Format("m:{0,-10:F6}q:{1,-10:F6}r:{2,-10:F6}", m, q, r));
 }
        public static CreditResult DoCalculation(CreditParameters creditParameters)
        {
            var q = 1.0d + creditParameters.TotalLoanRate / (double)creditParameters.InstallmentsPerYear;
            var qPowN = Math.Pow(q, creditParameters.InstallmentsCount);
            var singleRate = creditParameters.CreditValue * qPowN * (q - 1) / (qPowN - 1);

            return new CreditResult
            {
                InstallmentValue = singleRate,
                TotalCredit = creditParameters.InstallmentsCount * singleRate,
            };
        }
        public static void DoSimulationWithFixedInstallmentValue(CreditParameters creditParameters, Action<int, double, double, double, double, double> displayAction)
        {
            var multiplier = creditParameters.LoanRate / creditParameters.InstallmentsPerYear;
            var remainingCapital = creditParameters.CreditValue;
            var installmentValue = creditParameters.InstallmentValue;

            var counter = 0;
            do
            {
                var interest = multiplier * remainingCapital;
                var capitalPart = installmentValue - interest;
                displayAction(++counter, installmentValue, interest, capitalPart, remainingCapital, remainingCapital -= capitalPart);
            }
            while (installmentValue <= remainingCapital);

            displayAction(++counter, remainingCapital, 0.0d, 0.0d, remainingCapital, 0.0d);
        }
        //static void Main(string[] args)
        //{
        //    ConsoleKeyInfo key;
        //    do
        //    {
        //        try
        //        {
        //            string line = string.Empty;
        //            Console.Write("Credit value: ");
        //            var creditParameters = new CreditParameters
        //            {
        //                CreditValue = Double.Parse(Console.ReadLine()),
        //            };

        //            Console.Write("Total installments: ");
        //            creditParameters.InstallmentsCount = Int32.Parse(Console.ReadLine());

        //            Console.Write("Installments per year: ");
        //            creditParameters.InstallmentsPerYear = Int32.Parse(Console.ReadLine());

        //            Console.Write("Loan rate (e.g. 5% = 0.05):");
        //            creditParameters.LoanRate = Double.Parse(Console.ReadLine());

        //            var res = KLSystems.Finances.Commons.CreditCalculator.DoCalculation(creditParameters);
        //            Console.WriteLine(String.Format("Installment value: {0:F4}", res.InstallmentValue));
        //            Console.WriteLine(String.Format("Total credit value: {0:F4}", res.TotalCredit));
        //        }
        //        catch(Exception excep)
        //        {
        //            Console.WriteLine(excep.Message);
        //        }

        //        Console.WriteLine("Do you want to continue ? ('Y' or 'y')");
        //        key = Console.ReadKey();
        //    }
        //    while (Char.ToUpper(key.KeyChar) == 'Y');
        //}

        static void Main(string[] args)
        {
            ConsoleKeyInfo key;
            do
            {
                try
                {
                    string line = string.Empty;
                    Console.Write("Credit value: ");
                    var creditParameters = new CreditParameters
                    {
                        CreditValue = Double.Parse(Console.ReadLine()),
                    };

                    Console.Write("Installments per year: ");
                    creditParameters.InstallmentsPerYear = Int32.Parse(Console.ReadLine());

                    Console.Write("Loan rate (e.g. 5% = 0.05): ");
                    creditParameters.LoanRate = Double.Parse(Console.ReadLine());

                    Console.Write("Fixed installment value: ");
                    creditParameters.InstallmentValue = Double.Parse(Console.ReadLine());


                    Commons.CreditCalculator.DoSimulationWithFixedInstallmentValue(creditParameters, DisplaySimulationRow);
                }
                catch (Exception excep)
                {
                    Console.WriteLine(excep.Message);
                }

                Console.WriteLine("Do you want to continue ? ('Y' or 'y')");
                key = Console.ReadKey();
            }
            while (Char.ToUpper(key.KeyChar) == 'Y');
        }