Skip to main content

amortization_solution

Function amortization_solution 

Source
pub fn amortization_solution<P, F, T>(
    rate: f64,
    periods: u32,
    present_value: P,
    future_value: F,
    timing: T,
) -> FinanceResult<AmortizationSolution>
where P: Into<f64> + Copy, F: Into<f64> + Copy, T: Into<PaymentTiming>,
Expand description

Build an amortization solution (payment + schedule access).

Prefer this when you want formulas and tables, not only a single f64. Timing accepts [PaymentTiming] or bool (false = end of period).

§Errors

Returns FinanceError for invalid rates, non-finite amounts, zero periods, or payment calculation failures (same domain as [crate::payment]).

§Examples

use finance_solution::*;

let solution = amortization_solution(0.005, 24, 12_000.0, 0.0, false).unwrap();
assert!(solution.payment().is_finite());
assert_eq!(solution.series().len(), 24);

// Year-1 interest (months 1–12)
let y1 = solution.cumipmt(1, 12).unwrap();
assert!(y1.is_finite());

Match structured errors:

use finance_solution::{amortization_solution, FinanceError};

match amortization_solution(0.01, 12, 5_000.0, 0.0, false) {
    Ok(sol) => {
        assert!(sol.payment().is_finite());
        sol.series().print_table(true, true);
    }
    Err(FinanceError::InvalidRate { rate }) => panic!("bad rate {rate}"),
    Err(e) => panic!("{e}"),
}

assert!(matches!(
    amortization_solution(-1.5, 12, 5_000.0, 0.0, false),
    Err(FinanceError::InvalidRate { .. })
));