public static double PV(double rate, double nPer, double pmt, double fv = 0.0, DueDatePeriod period = DueDatePeriod.EndOfPeriod)
        {
            double pv;

            if (rate == 0.0)
            {
                pv = -fv - pmt * nPer;
            }
            else
            {
                double factor = period == DueDatePeriod.EndOfPeriod ? 1.0 : 1.0 + rate;
                double pow    = Math.Pow(1.0 + rate, nPer);
                pv = -(fv + pmt * factor * ((pow - 1.0) / rate)) / pow;
            }
            return(pv);
        }
        private static double FV(double rate, double nPer, double pmt, double pv = 0.0, DueDatePeriod period = DueDatePeriod.EndOfPeriod)
        {
            double fv;

            if (rate == 0.0)
            {
                fv = -pv - pmt * nPer;
            }
            else
            {
                double factor = period == DueDatePeriod.EndOfPeriod ? 1.0 : 1.0 + rate;
                double pow    = Math.Pow(1.0 + rate, nPer);
                fv = -pv * pow - pmt / rate * factor * (pow - 1.0);
            }
            return(fv);
        }