2016-10-08 3 views
0

Я делаю проект, в котором я должен рассчитать год к настоящему времени сложный процент по сделкам. В настоящее время я получаю текущий баланс без каких-либо процентов. Я считаю, что моя проблема связана с циклом foreach, но я не знаю, где я ошибся. Он проходит через дни, но либо нет никакого интереса, который применяется или работает. Тотал не переносит должным образом.Суточный процентный интерес Loop

   public IEnumerable<DateTime> EachDay(DateTime from, DateTime thru) 
    { 
     for (var day = from.Date; day.Date <= thru.Date; day = day.AddDays(1)) 
      yield return day; 
    } 

    public decimal PrincipalplusInterest() 
    { 
     DateTime startDate = new DateTime(DateTime.Now.Year, 1, 1); 
     DateTime endDate = startDate.AddYears(1); 
     int compoundingTimes = 12; 

     TimeSpan duration = endDate - startDate; 
     var numberOfDaysInYear = duration.Days; 

     decimal runningTotal = 0; 
     double interestRate = InterestRate; 

     foreach (DateTime day in EachDay(startDate, endDate)) 
     { 
      decimal sumOfAnyTransactionToday = Transactions.Where(x => x.TransactionDate == day).Sum(x => x.Amount); 

      runningTotal = runningTotal + sumOfAnyTransactionToday; 

      double timePeriod = 1/numberOfDaysInYear; 
      double rate = interestRate/compoundingTimes; 
      double total = System.Convert.ToDouble(runningTotal); 

      double principalAndInterest = total * Math.Pow((1 + rate), (compoundingTimes * timePeriod)); 
      runningTotal = System.Convert.ToDecimal(principalAndInterest); 

     } 
     return runningTotal; 
    } 


    [DisplayName("Year to Date Interest")] 
    public decimal YrToDateInterest() 
    { 
     decimal interest = PrincipalplusInterest() - CurrentBalanceCalculation(); 
     return interest; 
    } 
+1

В дополнение к ответу ChrisF, его стоит отметить разницу между десятичной и дважды - в частности, так как вы «Имея дело с деньгами. http://stackoverflow.com/questions/1165761/decimal-vs-double-which-one-should-i-use-and-when – JonLord

ответ

0

Вы делаете целочисленная арифметика здесь:

double timePeriod = 1/numberOfDaysInYear; 

numberOfDaysInYear является INT, так деления 1 на это значение всегда возвращает 0.

Сделать расчет плавающей точкой, делая один из значения с плавающей запятой:

double timePeriod = 1.0/numberOfDaysInYear; 

, вероятно, самое легкое решение.

Также, если ваши транзакции содержат компонент времени, то этот оператор всегда будет возвращать ноль, если у вас не будет транзакции, которая произошла точно в полночь.

Transactions.Where(x => x.TransactionDate == day).Sum(x => x.Amount); 

Чтобы просто получить дату, что вам нужно сделать, получить Date составляющую DateTime объекта:

Transactions.Where(x => x.TransactionDate.Date == day).Sum(x => x.Amount); 
Смежные вопросы