public IEnumerable <double> Compute(NetPresentValueCalculationInputDto input)
        {
            var result = new List <double>();
            var netPresentValueAmount = input.CashFlows
                                        .Sum(cashFlow => cashFlow.CashFlowAmount / Math.Pow((input.DiscountRate / 100) + 1, cashFlow.Id));

            result.Add(netPresentValueAmount - input.InitialInvestment);
            return(result);
        }
Example #2
0
        public IEnumerable <double> Compute(NetPresentValueCalculationInputDto input)
        {
            var    result = new List <double>();
            double differenceBetweenIncrementalRateAndUpperBound = 0;

            for (double discountRate = input.LowerBound; discountRate <= input.UpperBound;)
            {
                double netPresentValueAmount = input.CashFlows
                                               .Sum(cashFlow => cashFlow.CashFlowAmount / Math.Pow((discountRate / 100) + 1, cashFlow.Id));
                result.Add(netPresentValueAmount - input.InitialInvestment);
                differenceBetweenIncrementalRateAndUpperBound = input.UpperBound - discountRate;
                if (differenceBetweenIncrementalRateAndUpperBound != 0)
                {
                    discountRate += Math.Min(differenceBetweenIncrementalRateAndUpperBound, input.IncrementalRate);
                }
                else
                {
                    discountRate += 1;
                }
            }
            return(result);
        }