Financial functions

PMT

Close: 151 of 291,987 recorded answers differ in the last bits, worst 4 ULP

Everything else matches (291,978 in the answer bank and 9 workbook cells). Last-bit means a finite number within 16 ULP of Excel's. How we measure this · See the Rust code

Local names in 40 languages
LanguageName in Excel
ArabicPMT
BulgarianPMT
CzechPMT
DanishYDELSE
GermanRMZ
GreekPMT
English (Australia)PMT
English (United Kingdom)PMT
English (United States)PMT
SpanishPAGO
EstonianPMT
FinnishMAKSU
FrenchVPM
HebrewPMT
CroatianPMT
HungarianRÉSZLET
IndonesianPMT
ItalianRATA
JapanesePMT
KoreanPMT
LithuanianPMT
LatvianPMT
NorwegianPMT
DutchBET
PolishPMT
Portuguese (Brazil)PGTO
Portuguese (Portugal)PGTO
RomanianPMT
RussianПЛТ
SlovakPMT
SlovenianPMT
Serbian (Latin)PMT
SwedishBETALNING
ThaiPMT
TurkishFAİZ_ORANI
UkrainianPMT
VietnamesePMT
Chinese (Simplified)PMT
Chinese (Hong Kong)PMT
Chinese (Traditional)PMT

Names from Microsoft's support site.

What it does

PMT(rate, nper, pv, [fv], [type])

PMT(rate, nper, pv, [fv], [type]) returns a fixed payment at a constant rate over equal periods. fv defaults to zero. Type zero (the default) pays at period end; type one pays at the beginning. Use a rate per payment period.

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.

=PMT(0,4,1000) returns -250: four equal outflows repay a positive principal. =PMT(0.25,1,1000,0,0) is about -1250, repaying the principal and one period’s interest.

Quirks

Cash inflows and outflows have opposite signs. A monthly payment needs a monthly rate and a count of months. Taxes and fees are outside this formula. Exactly zero rate has a separate linear branch; a merely small rate must retain the discount computation. Zero periods and invalid growth domains need error handling.

PMT takes ln(1+rate) from a series, and stores its quotient before the rate

With RN(v) meaning v rounded to 64 bits on the x87 unit and then stored to binary64, PMT with fv 0 and type 0 at rates from -1/3 to 1/2 runs: s = rate/(2+rate); L = 2s + 2s*(s^2*T), where T = 1/3 + s^2/5 + ... + s^20/23 by Horner, all in plain binary64, which is the atanh series for ln(1+rate) (Abramowitz and Stegun 4.1.27) with the 2s term added last; t = -(nper*L); u = exp(t) stored; em = RN(RN(RN(u-1)*t)/ln(u)) for |t| < 1, and RN(u-1) otherwise, Kahan's way of forming expm1; q = RN(pv/em); PMT = RN(q*rate). L is not the correctly rounded logarithm: at rate 0.05/12 it is 0x3f7107fd59addc8a, one unit below 0x3f7107fd59addc8b, and the common 30-year loan below comes out 1 unit from the correctly rounded payment.

Explanation (inferred): The range -1/3 to 1/2 is where twelve series terms converge, not a measured Excel boundary. Rate 0.419, near sqrt(2)-1, misses by 1 unit, so a range reduction may start there. Negative rates rest on 20 rates' controls and the recorded rows.

FormulaExcelMathematical value
=PMT(0.05/12,360,200000)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Typed formula.

mpmath at 800 bits with rate the binary64 0x3f71111111111111 that 0.05/12 evaluates to; correctly rounded.

-1073.6432460242781
0xc090c692af15f63a
-1073.643246024278
0xc090c692af15f639

Inputs, build details and evidence

PPMT is not PMT minus IPMT, and sits further from the exact value than PMT

On the 30-year loan PPMT(0.05/12,k,360,200000), for k from 1 to 12 every PPMT answer is 3 to 5 units above the correctly rounded principal payment, while PMT is 1 unit away. Excel's own answers do not satisfy the identity: in binary64, PMT - IPMT equals PPMT in 2 of the 12 periods and PMT - PPMT equals IPMT in 7. So reproducing PPMT from PMT and IPMT misses the last bits. FN-IPMT-001 gives the route Excel takes instead.

FormulaExcelMathematical value
=PPMT(0.05/12,1,360,200000)
Excel 16.0.20527.20088 Current Channel, Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA
Inputs and reference value

Typed formula.

mpmath at 800 bits with rate the binary64 0x3f71111111111111 that 0.05/12 evaluates to; correctly rounded.

-240.30991269094474
0xc06e09eace050723
-240.30991269094463
0xc06e09eace05071f

Inputs, build details and evidence

How to implement

The following is the current type-zero positive-rate discount route, with the recovered logarithm series used on -1/3<=rate<=1/2. The series reproduces 1,181 of 1,184 inferred logarithm values in the note; it still has exceptions inside that range. Its negative-rate and outer-domain limitations are stated below. Let D(op) mean ordinary binary64 round-to-nearest/even, and R(op) the stored 64-bit-significand operation.

  1. Reject zero periods with #NUM!. At exactly r=0, return -(pv+fv)/n. Otherwise reject a growth base 1+r<=0.
  2. Form s=D(r/D(2+r)), s2=D(s*s). Start T=D(1/23). For k=10 down to 1, assign T=D(D(T*s2)+D(1/(2*k+1))). Form a=D(2*s) and L=D(a+D(a*D(s2*T))). This is a twelve-term atanh expansion, not a correctly rounded log1p call.
  3. Store t=-D(n*L). Obtain the measured public exponential u=EXP(t). If u==1, let em=t. Otherwise set d=R(u-1); for abs(t)<1, use em=R(R(d*t)/LN(u)), where LN is the measured public stored result; otherwise use em=d. Reject zero or nonfinite em with #NUM! before division. This Kahan correction avoids cancellation in exp(t)-1.
  4. On the positive-rate, positive-period discount arm (t<0), form b=R(pv+fv), q=R(R(b/em)+fv), and return R(q*r) for type zero. Each addition and the division is a separate store. With fv=0 this reduces to quotient first, rate last.

Worked zero-future-value case, r=0.25,n=1,pv=1000: the stated reconstruction gives the following binary64 values. The stored correction moves em one representable step from the direct subtraction.

StageValueBits
Series logarithm L0.223143551314209740x3fcc8ff7c79a9a21
t=-n*L-0.223143551314209740xbfcc8ff7c79a9a21
Stored EXP u0.80x3fe999999999999a
Direct difference d-0.199999999999999960xbfc9999999999998
Corrected difference em-0.199999999999999980xbfc9999999999999
Balance quotient q-50000xc0b3880000000000
Payment-12500xc093880000000000

With the same rate, period and principal but fv=250, the first stored balance is 1250. Dividing by em and then adding 250 gives q=-6000.000000000001; the final payment is -1500.0000000000002. An algebraic one-period calculation rounds differently. These are worked evaluations of the reconstruction, not additional Excel captures.

The nonzero-future-value discount fold is supported by 192 paired calls in the current source; 60 and 99 separately selected readings distinguish its two additions. This later result supersedes that part of the older note's open list. The common loan PMT(0.05/12,360,200000) has recorded result -1073.6432460242781 in FN-PMT-001; replaying the stated series and stored quotient also gives that value.

The later R31 source also isolates the negative-rate type-zero balance fold. For a valid negative rate and finite nonzero em, use the same b=R(pv+fv), q=R(R(b/em)+fv), payment=R(q*r) stores. Its source records 192 paired future-value calls for that rate sign, 84 and 114 ties for the two additions, and 32 independently measured final-product ties. This closes that composition stage; it does not make the logarithm or every route exact.

Worked negative-rate composition: r=-0.25,n=1,pv=1000,fv=250. The series gives L=-0.2876820724517809, t is positive and stored EXP is 1.3333333333333333. The correction changes the direct difference 0.33333333333333326 to em 0.3333333333333333. The stored balance is 1250, q is 4000 and payment is -1000. These are reconstruction values, not new Excel readings. The interactive calculator is pinned separately and can predate this later source update.

The positive-rate code separately handles opposite equal balances as interest-only. Negative-rate calls now retain the common stored fold instead. Rates outside the series’ chosen convergence range, its in-range exceptions and remaining last-bit cases are not solved by this recipe. The note retains an in-range exception at rate 0.419; a global reduction boundary has not been identified. The series range is an implementation choice, not a measured global Excel boundary. The current type-one coefficient has its own measured stores; it must not be folded into the type-zero recipe by algebra alone. The old annuity write-up’s initial “blocked” section is superseded by its update and later code.

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.

PMT · 4 lines · calc-func/src/catalogue/financial.rs on GitHub
3 pmt_fn "PMT" (3, 5) [V "rate", V "nper", V "pv", V "fv", V "type"] |s, a, sv| {
    let t = timing(s, a, 4)?;
    tv_out(s, tv::pmt(num(s, a, 0)?, num(s, a, 1)?, num(s, a, 2)?, opt(s, a, 3, 0.0)?, t))
}

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
19929Windows, bitness not recorded, CPU not recorded47
20131Windows, bitness not recorded, AMD Ryzen 7 4800H with Radeon Graphics289,642
20228Windows, 64-bit, CPU not recorded2,076

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.

Retained controls from the indexed captures:

Build and recorded CPUCaptured call or argumentsExcel result
20131, AMD Ryzen 7 4800H with Radeon GraphicsPMT(0.1,1,1000,0,0)-1100.0000000000002 (0xc091300000000001)
20228, CPU not recordedPMT(0.0649385261097155,17,1567.723775140197,0,0)-154.99052913979685 (0xc0635fb26a2aa533)

These are earlier recorded answers, not new Excel runs or an additional cross-build comparison. The function JSON retains each source locator, exact argument bits where available, and input-route status. Call notation does not imply that captured binary64 values were entered as decimal formula literals.

Excel 16.0.20527.20088

Windows 64-bit (NT 10.0.26200), x86-64, AMD Ryzen 7 4800H, en-ZA

=PMT(0.05/12,360,200000) returned -1073.6432460242781 (0xc090c692af15f63a). Inputs were supplied through formula literals. These are controls from this environment, not a same-input comparison with another build.

Observed formulas and results
  • =PMT(0.05/12,360,200000) → -1073.6432460242781
    0xc090c692af15f63a (formula-literal)

Excel 16.0 build 19929

Windows, bitness not recorded, CPU not recorded

47 captured inputs are indexed for this environment. Capture dates are not recorded. This is a reading count, not a comparison with another build.

Excel 16.0 build 20131

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

289,642 captured inputs are indexed for this environment. Capture dates: 2026-07-11 to 2026-07-23. This is a reading count, not a comparison with another build. Retained control PMT(0.1,1,1000,0,0) returned -1100.0000000000002 (0xc091300000000001). The selected archive row does not record its input plumbing; no input route is inferred.

Observed formulas and results
  • PMT(0.1,1,1000,0,0) → -1100.0000000000002
    0xc091300000000001 (not-recorded)

Excel 16.0 build 20228

Windows, 64-bit, CPU not recorded

2,076 captured inputs are indexed for this environment. Capture dates: 2026-08-09 to 2026-08-09. This is a reading count, not a comparison with another build. Retained control PMT(0.0649385261097155,17,1567.723775140197,0,0) returned -154.99052913979685 (0xc0635fb26a2aa533). The capture specifies exact-double bulk Value2 cell input.

Observed formulas and results
  • PMT(0.0649385261097155,17,1567.723775140197,0,0) → -154.99052913979685
    0xc0635fb26a2aa533 (cell-value2)

Alternatives

IPMT and PPMT split interest and principal; PV and FV solve for a balance; RATE solves for the periodic rate.

Named variants

No named variants are recorded yet.

Suggest a correction or contribute an implementation · For agents