Financial functions

PV

Known larger differences on 162 of 1,314 recorded answers

Of 1,314 recorded answers (1,308 in the answer bank and 6 workbook cells), 162 do not match: 15 differ by more than 16 ULP, 147 differ by at most 16 ULP. How we measure this · See the Rust code

Local names in 40 languages
LanguageName in Excel
ArabicPV
BulgarianPV
CzechSOUČHODNOTA
DanishNV
GermanBW
GreekPV
English (Australia)PV
English (United Kingdom)PV
English (United States)PV
SpanishVA
EstonianPV
FinnishNykyarvo
FrenchPV
HebrewPV
CroatianPV
HungarianMÉ
IndonesianPV
ItalianVA
JapanesePV
KoreanPV
LithuanianPV
LatvianPV
NorwegianNÅVERDI
DutchHW
PolishPV
Portuguese (Brazil)VP
Portuguese (Portugal)VA
RomanianVPL
RussianПС
SlovakPV
SlovenianPV
Serbian (Latin)PV
SwedishNUVÄRDE
ThaiPV
TurkishBD
UkrainianЗв
VietnamesePV
Chinese (Simplified)PV
Chinese (Hong Kong)PV
Chinese (Traditional)PV

Names from Microsoft's support site.

What it does

PV(rate, nper, pmt, [fv], [type])

PV(rate,nper,pmt,[fv],[type]) solves the present value of fixed payments and a final balance. Rate and period count must use the same interval. Type zero pays at the end of each period; type one at its beginning.

Try it

Input cells (optional)

Example: {"B2": 3, "B3": 4}. A1 holds the formula. Other cells need values before a formula can read them.

Enter a formula, then calculate.

Runs locally in your browser with OneCalc. Its answer may differ from Excel. Use English function names and commas between arguments.

=PV(0,4,-250) returns 1000. Four negative payments are balanced by a positive present value. =PV(0.25,1,0,1250) is about -1000: a future inflow has a negative present outflow under this sign convention.

Quirks

At least a payment or a future value must be supplied. Inflows and outflows have opposite signs. The current PV helper uses a small-rate band abs(rate)<1e-12 for its linear branch; PMT’s separately measured zero-rate rule is exact equality. Do not transfer one function’s branch boundary to another.

How to implement

For a mathematical route put g=(1+r)^n and a=(1+r*type)*(g-1)/r, then return -(fv+pmt*a)/g. At zero rate the expression has the limit -(fv+pmt*n). The current helper implements that limit over its small-rate band, otherwise uses its power/annuity-term body and explicit nonfinite checks. Near zero, a log1p/expm1 formulation is numerically useful but changes intermediate rounding. Its last-bit behaviour is not solved by copying the PMT discount recipe.

Rust code

Show the CalcFunc source of this function

Quoted from the public repository DnaCalc/DnaCalc, crates calc-func and calc-fml, at commit 9e1884369a67. Comments are the source's own. A kernel shared with other functions appears once, on its module page.

PV · 4 lines · calc-func/src/catalogue/financial.rs on GitHub
1 pv_fn "PV" (3, 5) [V "rate", V "nper", V "pmt", V "fv", V "type"] |s, a, sv| {
    let t = timing(s, a, 4)?;
    tv_out(s, tv::pv(num(s, a, 0)?, num(s, a, 1)?, num(s, a, 2)?, opt(s, a, 3, 0.0)?, t))
}
growth_allow_nonpositive_base · 5 lines · calc-func/src/ported/financial_time_value_family.rs on GitHub
fn growth_allow_nonpositive_base(periodic_rate: f64, periods: f64) -> Result<f64, FinancialError> {
    validate_finite(&[periodic_rate, periods])?;
    let base = 1.0 + periodic_rate;
    growth_from_base(base, periods)
}
annuity_term_allow_nonpositive_base · 16 lines · calc-func/src/ported/financial_time_value_family.rs on GitHub
fn annuity_term_allow_nonpositive_base(
    periodic_rate: f64,
    periods: f64,
    timing: PaymentTiming,
) -> Result<f64, FinancialError> {
    if periodic_rate.abs() < EPSILON {
        return Ok(periods);
    }
    let factor = growth_allow_nonpositive_base(periodic_rate, periods)?;
    let term = timing.factor(periodic_rate) * (factor - 1.0) / periodic_rate;
    if term.is_finite() {
        Ok(term)
    } else {
        Err(FinancialError::Num)
    }
}
pv · 23 lines · calc-func/src/ported/financial_time_value_family.rs on GitHub
pub fn pv(
    periodic_rate: f64,
    periods: f64,
    payment_value: f64,
    future_value: f64,
    timing: PaymentTiming,
) -> Result<f64, FinancialError> {
    validate_finite(&[periodic_rate, periods, payment_value, future_value])?;
    if periodic_rate.abs() < EPSILON {
        return Ok(-(future_value + payment_value * periods));
    }
    let factor = growth_allow_nonpositive_base(periodic_rate, periods)?;
    let term = annuity_term_allow_nonpositive_base(periodic_rate, periods, timing)?;
    if factor == 0.0 {
        return Err(FinancialError::Div0);
    }
    let result = -(future_value + payment_value * term) / factor;
    if result.is_finite() {
        Ok(result)
    } else {
        Err(FinancialError::Num)
    }
}

Kernels shared with other functions

Argument and result plumbing

  • fail catalogue/kit
  • num catalogue/kit
  • opt catalogue/kit

No implementation has been published with a Handbook test suite for this function.

Version differences

The recorded environments below distinguish a reading from a same-input comparison. Counts describe captured inputs in each environment; overlapping captures and comparisons are not totals of unique worksheet calls.

Excel 16.0 buildPlatform and CPUCaptured inputs
20131Windows, bitness not recorded, AMD Ryzen 7 4800H with Radeon Graphics48
20430Windows, 64-bit, CPU not recorded1,230

The record contains no same-input comparison between these environments. Reading different inputs on different builds does not establish either a version change or cross-build agreement.

Recorded environments and comparison details.

Excel 16.0 build 20131

Windows, bitness not recorded, AMD Ryzen 7 4800H with Radeon Graphics

48 captured inputs are indexed for this environment. Capture dates: 2026-07-11 to 2026-07-11. This is a reading count, not a comparison with another build.

Excel 16.0 build 20430

Windows, 64-bit, CPU not recorded

1,230 captured inputs are indexed for this environment. Capture dates: 2026-09-29 to 2026-09-29. This is a reading count, not a comparison with another build.

Alternatives

NPV accepts varying equally spaced amounts; XNPV uses dates; PMT and FV solve other annuity variables.

Named variants

No named variants are recorded yet.

Suggest a correction or contribute an implementation · For agents