PRICEDISC(settlement, maturity, discount, redemption, [basis]) returns the price per 100 of
face value of a security sold at a discount: one that pays nothing until maturity, when it pays
redemption.
The model is simple bank discount. With T the year fraction from settlement to maturity under
the chosen day-count basis, and d the discount rate:
price = redemption × (1 − d × T)
Written with B the number of days in the year implied by the basis and DSM the number of days
from settlement to maturity, so that T = DSM/B:
Microsoft's page prints its equation as an image that could not be read, and defines B and DSM
in words. The expression above is the one the notes below record from Excel's own answers.
The discount is charged on the redemption value, not on the amount paid, and it is charged once.
Nothing compounds. That makes the price a straight line in time, falling from redemption at
T = 0 and reaching zero at T = 1/d. A 10% discount rate reaches zero at ten years.
Microsoft's example: settlement 16 February 2008, maturity 1 March 2008, discount 5.25%, redemption
100, basis 2 (Actual/360). That is 14 days, and 2008 is a leap year, so
100 × (1 − 0.0525 × 14/360) = 99.795833…
which Microsoft shows as $99.80.
Arguments
Argument
Meaning
Default
settlement
The date the buyer purchases the security, after its issue date. Required.
—
maturity
The date the security expires. Required.
—
discount
The security's discount rate, as a decimal fraction. Required.
—
redemption
The redemption value per $100 of face value. Required.
—
basis
The day-count basis. Optional.
0
The documented basis values are the standard five, as on the DISC page: 0 or
omitted = US (NASD) 30/360, 1 = Actual/actual, 2 = Actual/360, 3 = Actual/365, 4 = European
30/360. Dates and basis are documented as truncated to integers, and Microsoft advises entering
dates with DATE rather than as text.
redemption is documented as a per-100 quantity. The result is proportional to it, so passing an
amount returns the price of that amount; the function has no way to tell the two apart.
Numeric coercion of the argument slots follows the shared call model; see
Coercion and lifting.
Try it
Quirks
Result and edge cases
Returns Number, a price per 100 of face value, or an amount in the units of redemption when
redemption is an amount.
A negative price is an answer, not an error. There is no check on the result. In the 2,400
rows behind the notes below (Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800H), 284
return a negative price and none returns an error. The documented conditions are on the inputs;
a long span at a high discount passes all of them. The sibling RECEIVED does
refuse the equivalent case, and the two functions differ here.
settlement ≥ maturity is documented as #NUM!, not a reversed reading.
The fractional part of a date is dropped. 195 of those rows carry a fractional date, and each
fits the integer day count.
The 1900 calendar. The rows include a settlement of serial 60, the fictitious 29 February
1900, and on basis 4 it counts as day 29 of February, not as 1 March. The basis 1 treatment of
the same date is the subject of the second note below.
Empty, missing and error arguments are expected to follow the shared call model; see
The value universe. No reading records this for PRICEDISC.
Errors
As documented on Microsoft's PRICEDISC page:
Error
Condition
#VALUE!
settlement or maturity is not a valid date
#NUM!
discount ≤ 0 or redemption ≤ 0
#NUM!
basis < 0 or basis > 4
#NUM!
settlement ≥ maturity
None of these rows is measured. All 2,400 recorded rows return a number, so the table is what
Microsoft states and nothing more.
The discount-security functions run a fixed formula order on the x87 unit
With B the year basis and D the day count, Excel evaluates DISC = (1 - pr/red) * (B/D); INTRATE = ((red - inv)/inv) * (B/D); RECEIVED = inv / (1 - (disc*D)/B); PRICEDISC = red - ((disc*red)*D)/B; TBILLYIELD = ((100 - pr)/pr) * (360/D), each + - * / taken from the x87 unit at precision 64 and stored to binary64. Results can sit several units from the exact value: the DISC row below is 5 units below it.
Formula
Excel
Mathematical value
DISC(37655, 38261, 94.87631295104353, 102.73579504052532, 3) Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
settlement: 37655 0x40e262e000000000
maturity: 38261 0x40e2aea000000000
pr: 94.87631295104353 0x4057b81582ea72c4
redemption: 102.73579504052532 0x4059af174414e760
basis: 3 0x4008000000000000
Exact rational value of the same formula from the binary64 inputs, correctly rounded.
0.046077868684136686 0x3fa79784b622b014
0.04607786868413672 0x3fa79784b622b019
TBILLYIELD(47701, 47702, 2.279784366464575) Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
settlement: 47701 0x40e74aa000000000
maturity: 47702 0x40e74ac000000000
pr: 2.279784366464575 0x40023cff95ff2def
Exact rational value of the same formula from the binary64 inputs, correctly rounded.
15430.96713248709 0x40ce237bcaff517a
15430.967132487087 0x40ce237bcaff5178
INTRATE(58548, 58599, 428532.13421818457, 6.805737049418593, 0) Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
On basis 1 the fictitious 1900-02-29 is not a leap day, and YEARFRAC takes serial 0 as a date
Excel's calendar holds a 29 February 1900, serial 60, that never existed. On basis 1 (actual/actual) it does not make 1900 a leap year: YEARFRAC(59,60,1) is 1/365, where the real 1904-02-29 gives YEARFRAC(1520,1521,1) = 1/366. Serial 0 is accepted as a date: YEARFRAC(0,5,0) is 5/360 and YEARFRAC(0,60,1) is 60/365. Reversed dates give the same answer as in order. ACCRINTM, DISC, INTRATE, PRICEDISC and RECEIVED take the same 365 and 366 on those dates: DISC(59,60,99,100,1) is about 3.65 and DISC(1520,1521,99,100,1) about 3.66.
Formula
Excel
Mathematical value
YEARFRAC(59, 60, 1) Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
Number supplied through a cell.
start_date: 59 0x404d800000000000
end_date: 60 0x404e000000000000
basis: 1 0x3ff0000000000000
0.0027397260273972603 0x3f66719f3601671a
—
YEARFRAC(1520, 1521, 1) Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
Number supplied through a cell.
start_date: 1520 0x4097c00000000000
end_date: 1521 0x4097c40000000000
basis: 1 0x3ff0000000000000
0.00273224043715847 0x3f6661ec6a5122f9
—
YEARFRAC(0, 5, 0) Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
Number supplied through a cell.
start_date: 0 0x0000000000000000
end_date: 5 0x4014000000000000
basis: 0 0x0000000000000000
0.013888888888888888 0x3f8c71c71c71c71c
—
YEARFRAC(0, 60, 1) Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
Number supplied through a cell.
start_date: 0 0x0000000000000000
end_date: 60 0x404e000000000000
basis: 1 0x3ff0000000000000
0.1643835616438356 0x3fc50a8542a150a8
—
DISC(59, 60, 99, 100, 1) Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
Number supplied through a cell.
settlement: 59 0x404d800000000000
maturity: 60 0x404e000000000000
pr: 99 0x4058c00000000000
redemption: 100 0x4059000000000000
basis: 1 0x3ff0000000000000
3.650000000000003 0x400d33333333333a
—
DISC(1520, 1521, 99, 100, 1) Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading fileInputs and reference value
The arithmetic is one subtraction, two multiplications and one division. Two things matter: how T
is obtained, and the order of the operations.
Near-zero prices. Where d × T is close to 1, the subtraction cancels: the result is small
and its relative error is large, though its absolute error stays of the order of rounding at the
size of redemption.
The year length at basis 1. Microsoft says only that B is the number of days in the year.
Reading B back from the 815 basis 1 rows gives one rule, and all 815 fit it to at least ten
significant figures:
for a span of at most one year, if both dates are in one calendar year, B is that year's
length; otherwise B is 366 if a 29 February lies in the span and 365 if not;
for a span of more than one year, B is the average length of the calendar years from the
settlement year to the maturity year, both included.
So 31 May 2012 to 19 February 2013 is 264 days with B = 365, although 2012 is a leap year,
because 29 February 2012 lies before the span. And 30 April 1923 to 12 June 1924 is 409 days with
B = 365.5, the average of 365 and 366.
The 30/360 bases. All rows at bases 0 and 4 fit the standard US and European 30/360 counts,
with the one 1900 date noted above. PRICEMAT is the family member that departs from the standard
rule at basis 0; see PRICEMAT.
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.
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
20430
Windows, 64-bit, AMD Ryzen 7 4800H with Radeon Graphics
2,400
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.
Windows, 64-bit, AMD Ryzen 7 4800H with Radeon Graphics
2,400 captured inputs are indexed for this environment. Capture dates: 2026-09-25 to 2026-09-25. This is a reading count, not a comparison with another build.
Alternatives
Relationships
DISC — the inverse: given the price, recover the rate.
DISC(s, m, PRICEDISC(s, m, d, r, b), r, b) returns d up to floating-point rounding, for any
positive price. A negative price from PRICEDISC has no inverse, because DISC documents
pr ≤ 0 as #NUM!.
RECEIVED — the same relation solved for the other end of the trade: price
known, redemption wanted. PRICEDISC multiplies by (1 − d × T) and RECEIVED divides by it.
INTRATE — the same trade quoted on the investment. If the rate you hold is
an INTRATE-style rate, it is not a valid discount here. Convert it first with
d = r / (1 + r × T).
TBILLPRICE — this function fixed to redemption 100 and Actual/360, with a one-year limit.
PRICEMAT — the price of a security that does pay interest, all at
maturity. PRICEDISC models no interest at all.
YEARFRAC — the year fraction on its own, and the quickest way to separate a
calendar question from a price question.