finanza/interest
Time-value-of-money helpers built on
finanza/decimal.
Every function takes its inputs as decimals, computes in decimal,
and rounds the final result with HalfEven (“banker’s”) to the
caller-supplied number of decimal places.
Types
Errors raised by interest functions.
pub type InterestError {
NegativePrincipal
NegativeRate
PeriodsOutOfRange
CompoundsOutOfRange
NegativeDigits
ArithmeticError(error: decimal.ArithmeticError)
}
Constructors
-
NegativePrincipalprincipalwas negative. -
NegativeRateratewas negative. -
PeriodsOutOfRangeperiodswas zero or negative, or exceeded the supported range1..=1200(100 years of monthly compounding). -
CompoundsOutOfRangecompounds_per_yearwas zero or negative. -
NegativeDigitsdigitswas negative. -
ArithmeticError(error: decimal.ArithmeticError)Underlying decimal arithmetic produced an error.
Values
pub fn compound_interest(
principal principal: decimal.Decimal,
annual_rate annual_rate: decimal.Decimal,
years years: Int,
compounds_per_year compounds_per_year: Int,
digits digits: Int,
) -> Result(decimal.Decimal, InterestError)
Future value under compound interest:
FV = principal × (1 + annual_rate / compounds_per_year)^(compounds_per_year × years)
pub fn effective_annual_rate(
nominal_rate nominal_rate: decimal.Decimal,
compounds_per_year compounds_per_year: Int,
digits digits: Int,
) -> Result(decimal.Decimal, InterestError)
Effective annual rate from a nominal rate compounded
compounds_per_year times per year:
EAR = (1 + nominal_rate / compounds_per_year)^compounds_per_year - 1
pub fn future_value(
present present: decimal.Decimal,
rate_per_period rate_per_period: decimal.Decimal,
periods periods: Int,
digits digits: Int,
) -> Result(decimal.Decimal, InterestError)
Future value of present after periods periods at rate_per_period.
pub fn payment(
principal principal: decimal.Decimal,
rate_per_period rate_per_period: decimal.Decimal,
periods periods: Int,
digits digits: Int,
) -> Result(decimal.Decimal, InterestError)
Periodic payment for a fully-amortising loan:
PMT = principal × rate / (1 - (1 + rate)^(-periods))
When rate_per_period is zero, returns straight-line
principal / periods.
pub fn present_value(
future future: decimal.Decimal,
rate_per_period rate_per_period: decimal.Decimal,
periods periods: Int,
digits digits: Int,
) -> Result(decimal.Decimal, InterestError)
Present value of future discounted at rate_per_period for
periods periods.
pub fn simple_interest(
principal principal: decimal.Decimal,
rate rate: decimal.Decimal,
periods periods: Int,
digits digits: Int,
) -> Result(decimal.Decimal, InterestError)
Simple interest: I = P × r × t.