pub fn amortization_solution<P, F, T>(
rate: f64,
periods: u32,
present_value: P,
future_value: F,
timing: T,
) -> FinanceResult<AmortizationSolution>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 { .. })
));