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.
Financial functions
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
| Language | Name in Excel |
|---|---|
| Arabic | PV |
| Bulgarian | PV |
| Czech | SOUČHODNOTA |
| Danish | NV |
| German | BW |
| Greek | PV |
| English (Australia) | PV |
| English (United Kingdom) | PV |
| English (United States) | PV |
| Spanish | VA |
| Estonian | PV |
| Finnish | Nykyarvo |
| French | PV |
| Hebrew | PV |
| Croatian | PV |
| Hungarian | MÉ |
| Indonesian | PV |
| Italian | VA |
| Japanese | PV |
| Korean | PV |
| Lithuanian | PV |
| Latvian | PV |
| Norwegian | NÅVERDI |
| Dutch | HW |
| Polish | PV |
| Portuguese (Brazil) | VP |
| Portuguese (Portugal) | VA |
| Romanian | VPL |
| Russian | ПС |
| Slovak | PV |
| Slovenian | PV |
| Serbian (Latin) | PV |
| Swedish | NUVÄRDE |
| Thai | PV |
| Turkish | BD |
| Ukrainian | Зв |
| Vietnamese | PV |
| Chinese (Simplified) | PV |
| Chinese (Hong Kong) | PV |
| Chinese (Traditional) | PV |
Names from Microsoft's support site.
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.
=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.
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.
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.
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 GitHub1 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 GitHubfn 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 GitHubfn 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 GitHubpub 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)
}
}
tv_out catalogue/financialtiming catalogue/financialbackend::sqrt ported/excel_numericbinary_with ported/excel_numericexcel_pow_positive ported/excel_numericexcel_pow_chain ported/excel_numericexcel_x87_mul ported/excel_numericexcel_x87_recip ported/excel_numericmul ported/excel_numeric/x87recip ported/excel_numeric/x87pow2_positive ported/excel_numeric/x87_chainspow2 ported/excel_numeric/x87_chainsexp_ext ported/excel_numeric/x87_chainsexp_with ported/excel_numeric/x87_chainsexcel_exp ported/excel_numeric/x87_chainslog_with ported/excel_numeric/x87_chainsexcel_log ported/excel_numeric/x87_chainsPaymentTiming::factor ported/financial_time_value_familyvalidate_finite ported/financial_time_value_familygrowth ported/financial_time_value_familyannuity_term ported/financial_time_value_familygrowth_from_base ported/financial_time_value_familybalance_equation ported/financial_time_value_familyvalues_bracket_root ported/financial_time_value_familybisect_rate_bracket ported/financial_time_value_familysearch_rate_bracket_from_zero ported/financial_time_value_familyrate ported/financial_time_value_familypolish_root ported/financial_time_value_familyrate_root ported/financial_time_value_familyexact_integer_magnitude ported/power_fnaccept_negative_base_odd_root ported/power_fnbinexp_positive ported/power_fnpower_kernel ported/power_fnNo implementation has been published with a Handbook test suite for this function.
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 build | Platform and CPU | Captured inputs |
|---|---|---|
| 20131 | Windows, bitness not recorded, AMD Ryzen 7 4800H with Radeon Graphics | 48 |
| 20430 | Windows, 64-bit, CPU not recorded | 1,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.
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.
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.
NPV accepts varying equally spaced amounts; XNPV uses dates; PMT and FV solve other annuity variables.
No named variants are recorded yet.
Suggest a correction or contribute an implementation · For agents