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
Language
Name in Excel
Arabic
PMT
Bulgarian
PMT
Czech
PMT
Danish
YDELSE
German
RMZ
Greek
PMT
English (Australia)
PMT
English (United Kingdom)
PMT
English (United States)
PMT
Spanish
PAGO
Estonian
PMT
Finnish
MAKSU
French
VPM
Hebrew
PMT
Croatian
PMT
Hungarian
RÉSZLET
Indonesian
PMT
Italian
RATA
Japanese
PMT
Korean
PMT
Lithuanian
PMT
Latvian
PMT
Norwegian
PMT
Dutch
BET
Polish
PMT
Portuguese (Brazil)
PGTO
Portuguese (Portugal)
PGTO
Romanian
PMT
Russian
ПЛТ
Slovak
PMT
Slovenian
PMT
Serbian (Latin)
PMT
Swedish
BETALNING
Thai
PMT
Turkish
FAİZ_ORANI
Ukrainian
PMT
Vietnamese
PMT
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
=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.
Formula
Excel
Mathematical 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-ZAInputs and reference value
Typed formula.
mpmath at 800 bits with rate the binary64 0x3f71111111111111 that 0.05/12 evaluates to; correctly rounded.
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.
Formula
Excel
Mathematical 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-ZAInputs and reference value
Typed formula.
mpmath at 800 bits with rate the binary64 0x3f71111111111111 that 0.05/12 evaluates to; correctly rounded.
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.
Reject zero periods with #NUM!. At exactly r=0, return -(pv+fv)/n. Otherwise reject a growth base 1+r<=0.
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.
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.
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.
Stage
Value
Bits
Series logarithm L
0.22314355131420974
0x3fcc8ff7c79a9a21
t=-n*L
-0.22314355131420974
0xbfcc8ff7c79a9a21
Stored EXP u
0.8
0x3fe999999999999a
Direct difference d
-0.19999999999999996
0xbfc9999999999998
Corrected difference em
-0.19999999999999998
0xbfc9999999999999
Balance quotient q
-5000
0xc0b3880000000000
Payment
-1250
0xc093880000000000
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.
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))
}
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 build
Platform and CPU
Captured inputs
19929
Windows, bitness not recorded, CPU not recorded
47
20131
Windows, bitness not recorded, AMD Ryzen 7 4800H with Radeon Graphics
289,642
20228
Windows, 64-bit, CPU not recorded
2,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.
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.
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.
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.