Financial functions

DISC

Matches all 2,466 recorded answers

Recorded: 2,400 in the answer bank and 66 workbook cells. How we measure this · See the Rust code

Local names in 40 languages
LanguageName in Excel
ArabicDISC
BulgarianDISC
CzechDISC
DanishDISKONTO
GermanRABATT
GreekDISC
English (Australia)DISC
English (United Kingdom)DISC
English (United States)DISC
SpanishDISC
EstonianDISC
FinnishDISKONTTOKORKO
FrenchDISQUE
HebrewDISC
CroatianDISC
HungarianLESZÁM
IndonesianDISC
ItalianDISC
JapaneseDISC
Korean구역
LithuanianDISC
LatvianDISC
NorwegianDISC
DutchDISCONTO
PolishSTOPA.DYSK
Portuguese (Brazil)DESC.
Portuguese (Portugal)DESC
RomanianDISC
RussianСКИДКА
SlovakDISC
SlovenianDISC
Serbian (Latin)DISC
SwedishDISK
ThaiDISC
TurkishİNDİRİM işlevi
UkrainianDISC
VietnameseDISC
Chinese (Simplified)圆盘
Chinese (Hong Kong)DISC
Chinese (Traditional)DISC

Names from Microsoft's support site.

What it does

DISC(settlement, maturity, pr, redemption, [basis])

DISC(settlement, maturity, pr, redemption, [basis]) returns the discount rate of a security bought at price pr per 100 of face value and redeemed at redemption per 100 at maturity.

The underlying model is simple bank discount, not compound interest. Let

  • T = the year fraction from settlement to maturity under the chosen day-count basis,
  • d = the discount rate the function returns.

The model is the linear price relation

pr = redemption × (1 − d × T)

and DISC inverts it:

d = (redemption − pr) / redemption × 1/T
  = (1 − pr/redemption) / T

Written the way Microsoft's page writes it, with B the number of days in the year implied by the basis and DSM the number of days from settlement to maturity, T = DSM/B and

DISC = (redemption − pr) / redemption × B / DSM

The defining feature — and the reason DISC and INTRATE are not the same function with the arguments renamed — is the denominator of the yield fraction. DISC divides the gain by the redemption value, the amount you get back. INTRATE divides it by the investment, the amount you put in. Money-market instruments are quoted both ways, and swapping them is a real pricing error, not a rounding one.

The two are related exactly: with r the INTRATE figure on the same dates and amounts,

r = d / (1 − d·T)        and        d = r / (1 + r·T)

Domain and range: d is unbounded above as T → 0 (a security maturing tomorrow at any discount implies a huge annualized rate), and d < 0 whenever pr > redemption — a premium purchase gives a negative discount rate. The function has a pole at T = 0, which the settlement-before-maturity requirement removes from the admissible domain.

Nothing here is compounded. DISC is a first-order quotation convention; over long horizons it is not a rate of return in any compounding sense.

Arguments

ArgumentMeaningDefault
settlementThe settlement date — when the security trades to the buyer. Required.—
maturityThe maturity date — when the security expires. Required.—
prThe security's price per $100 face value. Required.—
redemptionThe security's redemption value per $100 face value. Required.—
basisThe day-count basis. Optional.0

Microsoft's page documents the basis values as:

basisMethod
0 or omittedUS (NASD) 30/360
1Actual/actual
2Actual/360
3Actual/365
4European 30/360

Two documented rules that matter more than they look:

  1. Dates are Excel serial numbers, and settlement, maturity and basis are truncated to integers. A date-with-time argument therefore loses its time part silently.
  2. pr and redemption are per 100 of face value, not amounts. A bill with 1,000,000 face bought for 987,500 is pr = 98.75, not 987500. Because both appear only in the ratio pr/redemption, passing both as raw amounts happens to give the same answer — but mixing one raw amount with one per-100 quote does not, and the function cannot detect it.

The argument slots are numeric and subject to ordinary to-number coercion; see Coercion and lifting.

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.

Quirks

Result and edge cases

Returns Number — an annualized rate expressed as a decimal fraction, so 5.34% comes back as 0.0534.

  • settlement ≥ maturity is a domain error, not a negated result. There is no "reversed-dates" reading; see Errors below.
  • pr > redemption is admissible and returns a negative rate.
  • Basis choice changes the answer materially, not marginally: a 91-day bill priced on Actual/360 and on Actual/365 differ in the fourth significant figure of the rate. The basis is part of the quotation, not a rounding preference.
  • Non-integer basis is truncated toward zero before the range check, so basis = 4.9 reads as 4.
  • Empty, missing and error arguments follow the shared call model; see The value universe.

Errors

As documented on Microsoft's DISC page:

ErrorCondition
#VALUE!settlement or maturity is not a valid serial date number
#NUM!pr ≤ 0, or redemption ≤ 0
#NUM!basis < 0 or basis > 4
#NUM!settlement ≥ maturity

Non-numeric text in any slot and error values in any argument surface under the shared coercion rules.

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.

FormulaExcelMathematical value
DISC(37655, 38261, 94.87631295104353, 102.73579504052532, 3)
Excel 16.0 build 20430, Windows 64-bit, AMD Ryzen 7 4800H
Inputs 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 4800H
Inputs 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 4800H
Inputs and reference value

Number supplied through a cell.

settlement: 58548
0x40ec968000000000

maturity: 58599
0x40ec9ce000000000

investment: 428532.13421818457
0x411a27d089707de5

redemption: 6.805737049418593
0x401b39132211b6ad

basis: 0
0x0000000000000000

-7.199885653133469
0xc01cccaed31c9766
—

Inputs, build details and evidence

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.

FormulaExcelMathematical value
YEARFRAC(59, 60, 1)
Excel 16.0.20527.20088, Windows, bitness and CPU not recorded in this reading file
Inputs 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 file
Inputs 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 file
Inputs 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 file
Inputs 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 file
Inputs 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 file
Inputs and reference value

Number supplied through a cell.

settlement: 1520
0x4097c00000000000

maturity: 1521
0x4097c40000000000

pr: 99
0x4058c00000000000

redemption: 100
0x4059000000000000

basis: 1
0x3ff0000000000000

3.6600000000000033
0x400d47ae147ae14f
—

Inputs, build details and evidence

How to implement

Numerical notes

DISC is arithmetically trivial and definitionally hard. Almost all of the difficulty is in T.

Day counts are integer arithmetic on a calendar, and the calendar rules are the algorithm. The 30/360 conventions are not approximations of the actual calendar; they are separate, exactly specified counting rules, and the US (NASD) and European variants differ precisely in how they treat the 31st and the end of February. An implementation that gets the price ratio right to the last bit and the end-of-month adjustment wrong is wrong by cents, not by ULPs.

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.

DISC · 4 lines · calc-func/src/catalogue/bonds.rs on GitHub
16 disc_fn "DISC" (4, 5) [V "settlement", V "maturity", V "pr", V "redemption", V "basis"] |s, a, sv| {
    let (settlement, maturity) = (date_1900(s, a, 0, sv)?, date_1900(s, a, 1, sv)?);
    bill_out(s, bill::disc_kernel(settlement, maturity, num(s, a, 2)?, num(s, a, 3)?, basis(s, a, 4)?))
}
disc_kernel · 26 lines · calc-func/src/ported/discount_bill_yearfrac_family.rs on GitHub
pub fn disc_kernel(
    settlement: f64,
    maturity: f64,
    pr: f64,
    redemption: f64,
    basis: Option<f64>,
) -> Result<f64, DiscountBillYearfracEvalError> {
    if !pr.is_finite() || !redemption.is_finite() {
        return Err(DiscountBillYearfracEvalError::Domain(
            WorksheetErrorCode::Value,
        ));
    }
    if pr <= 0.0 || redemption <= 0.0 {
        return Err(DiscountBillYearfracEvalError::Domain(
            WorksheetErrorCode::Num,
        ));
    }
    // Excel: (1 - pr/redemption)*(B/D) (dc-j9k: 60 of 60 readings in the catalogue oracle's
    // sheet dcj9k_closed_form; dividing by the fraction D/B matched 41).
    let (days, year) = security_days_and_year(settlement, maturity, basis)?;
    // Build20430's 12,000 original security readings distinguish stored PC64
    // operations from binary64 arithmetic. Keep the published association.
    let ratio = excel_x87_div(pr, redemption);
    let spread = excel_x87_sub(1.0, ratio);
    Ok(excel_x87_mul(spread, excel_x87_div(year, days)))
}

Kernels shared with other functions

Argument and result plumbing

  • fail catalogue/kit
  • num 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
20430Windows, 64-bit, AMD Ryzen 7 4800H with Radeon Graphics2,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.

Recorded environments and comparison details.

Excel 16.0 build 20430

Windows 64-bit, AMD Ryzen 7 4800H

DISC(37655, 38261, 94.87631295104353, 102.73579504052532, 3) returned 0.046077868684136686 (0x3fa79784b622b014). Inputs were supplied through cells using Value2. These are controls from this environment, not a same-input comparison with another build.

Observed formulas and results
  • DISC(37655, 38261, 94.87631295104353, 102.73579504052532, 3) → 0.046077868684136686
    0x3fa79784b622b014 (cell-value2)

Excel 16.0.20527.20088

Windows, bitness and CPU not recorded in this reading file

DISC(59, 60, 99, 100, 1) returned 3.650000000000003 (0x400d33333333333a). DISC(1520, 1521, 99, 100, 1) returned 3.6600000000000033 (0x400d47ae147ae14f). Inputs were supplied through cells using Value2. These are controls from this environment, not a same-input comparison with another build.

Observed formulas and results
  • DISC(59, 60, 99, 100, 1) → 3.650000000000003
    0x400d33333333333a (cell-value2)
  • DISC(1520, 1521, 99, 100, 1) → 3.6600000000000033
    0x400d47ae147ae14f (cell-value2)

Excel 16.0 build 20430

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

  • INTRATE — the same trade quoted on the investment instead of the redemption, with the exact conversion given above. The pair is the single most useful thing to keep straight in this family.
  • PRICEDISC — the inverse: given DISC's rate, recover pr. PRICEDISC(DISC(...)) should round-trip up to floating-point rounding.
  • YIELDDISC — the yield of a discounted security, which is the INTRATE-side quotation of the same instrument; do not read it as an inverse of DISC.
  • TBILLYIELD / TBILLPRICE / TBILLEQ — the same discount arithmetic hard-wired to the Treasury-bill Actual/360 convention, with no basis argument and their own 182-day rules.
  • YEARFRAC — the year-fraction machinery DISC depends on, exposed directly. If a DISC answer looks wrong, evaluating YEARFRAC(settlement, maturity, basis) is the fastest way to find out whether the day count or the price ratio is the culprit.

Named variants

No named variants are recorded yet.

Suggest a correction or contribute an implementation · For agents