Discount rate calculator
If 1,000 today becomes 1,210 after 2 periods, the discount rate is 10% per period. Enter the present value, the future value and the number of periods to recover the compound rate linking them, even when it is negative. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Present value
- 1,000
- Future value
- 1,210
- Periods
- 2
- Discount rate
- 10
- Discount rate decimal
- 0.1
The discount rate is the implied rate per period that turns a present value into a future value over a known number of compounding periods. It is the r in the identity present value times one plus r to the power of n equals future value, rearranged as r equals the nth root of future value over present value, minus one. Students, analysts, appraisers, and product teams use a discount rate calculator to recover that periodic rate from three lumps — present value, future value, and the period count — without opening a spreadsheet or guessing the yield.
How the discount rate turns present value, future value, and periods into a yield
The discount rate of a single lump that grows or shrinks from a present amount to a future amount is the periodic rate r that satisfies present value times one plus r to the power of n equals future value. Solving for that rate is not an iteration and not a cash-flow internal rate of return: it is the closed form r equals future value divided by present value, raised to one over n, minus one.
When the future amount is smaller than the present amount the rate is negative: a five-thousand present value that becomes four thousand after one period is a twenty percent decline per period. The identity is the same rearrangement textbooks write for compound interest solved for r, and it is the same rearrangement used to quote a holding-period yield on a zero-coupon instrument that has no coupons to reinvest.
This calculator does not take a stream of cash flows, does not subtract a time-zero outlay from a discounted sum, and does not apply a day-count convention or a compounding-frequency calendar: you supply one present lump, one future lump, and a period count, and it returns the unique real rate per period that compounds one into the other. Present value must not be zero, because the ratio of future value to present value is then undefined.
Periods must be a finite number strictly greater than zero, because the exponent one over n is otherwise undefined. The ratio of future value to present value must be positive so that the real nth root exists; opposite signs do not produce a real periodic rate. The capability returns the rate as a percent so ten percent comes back as ten, not zero point one, and also reports the decimal form for clients that prefer the fraction used inside one plus r to the n.
What you can do with it
Textbook TVM checks
Recover the periodic discount rate from a present lump, a future lump, and n so homework and exam keys match the closed form r = (FV/PV)^(1/n) - 1.
Zero-coupon implied yield
Back out the rate per compounding period from today's price and a known redemption amount without building a coupon schedule or an IRR loop.
FAQ
How is the discount rate calculated from present value and future value?
Both are rounded half-up for stable comparison across runtimes.
Is the result annual, monthly, or something else?
It is the rate per period you counted. If periods is years, the rate is per year; if periods is months, the rate is per month. The calculator does not convert an annual rate to a monthly rate or apply a day-count convention.
Is this the same as CAGR, NPV, or a compound-interest calculator?
No. A CAGR landing is searched for annualized growth language. NPV and DCF discount a stream of cash flows at a rate you already chose. Compound interest takes the rate as an input and returns a future balance. This tool solves the reverse TVM identity for r from PV, FV, and n.
Can the discount rate come out negative?
Yes. When the future value is smaller than the present value, the rate is negative: five thousand that shrinks to four thousand in one period is a twenty percent decline per period.
Can I use a fractional number of periods?
Yes. The number of periods only has to be greater than zero, and fractional values are accepted when the horizon is not a whole number of steps. The result is still a rate per period, not per year.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/fin/discount-rate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"present_value":1000,"future_value":1210,"periods":2}'const res = await fetch("https://api.kit.forhosting.com/fin/discount-rate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"present_value": 1000,
"future_value": 1210,
"periods": 2
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/discount-rate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"present_value": 1000,
"future_value": 1210,
"periods": 2
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/discount-rate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"present_value":1000,"future_value":1210,"periods":2}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"present_value":1000,"future_value":1210,"periods":2}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/discount-rate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"present_value": 1000,
"future_value": 1210,
"periods": 2
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.discount_rate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
This endpoint accepts present_value, future_value, and periods, returns the rate per period as a percent together with the decimal form, and fails with invalid_input when present value is zero because dividing by zero does not define a rate.
How the discount rate turns present value, future value, and periods into a yield
When present_value is one thousand, future_value is one thousand two hundred ten, and periods is two, the ratio is 1.21, the square root is 1.1, and the rate is ten percent per period.
Input contract, response shape, and error behaviour
If future value and present value have opposite signs, or the ratio is otherwise not a finite positive number, the real nth root does not exist and the task fails rather than returning NaN. Example: one thousand present, one thousand two hundred ten future, and two periods yield a discount rate of ten. POST a JSON body with three required finite numbers. present_value is the lump today in one currency unit; aliases pv, present, and principal map to the same field so a worksheet can keep its column names. future_value is the lump at the end of n periods in that same currency; aliases fv, future, and amount are accepted. periods is the number of compounding periods n; aliases n, nper, and number_of_periods are accepted; fractional periods are allowed when the horizon is not a whole number of steps. Each numeric field may arrive as a JSON number or a numeric string. Missing fields, empty strings, and non-finite values fail with invalid_input naming the field. If periods is zero, negative, or otherwise not strictly greater than zero, the request fails because the exponent one over n is undefined. On success the body echoes present_value, future_value, and periods, then reports discount_rate as a percentage rounded half-up to eight decimal places, discount_rate_decimal as the same rate as a fraction rounded half-up to ten decimal places, and a formula string restating r equals (FV/PV) to the power of one over n, minus one. Pair the JSON with your own rule for what a period means — a year, a month, a quarter — because this endpoint returns the rate per period you counted; it does not convert an annual rate to a monthly rate or the reverse.
Where a discount rate calculator earns its keep
Exam prep and classroom drills use a discount rate calculator to recover r from a textbook present value, future value, and n so the printed yield matches the closed form instead of a rounded spreadsheet guess. A discount-rate landing answers the reverse TVM question: given PV, FV, and n, what is r per period. Failed validation does not consume balance. Zero-coupon and strip desks back out the periodic rate implied by today's price and a known redemption amount over a known number of compounding steps, then pin discount_rate in a ticket so every conversation starts from one number. Product teams and FP&A templates recompute the implied rate when a future payout or a holding period changes mid-model; a tiny parse API avoids reinventing the power identity in every workbook. This is a different search and a different job from a compound-interest calculator, which takes the rate as an input and returns a future balance; from a CAGR calculator, which people search when they want annualized growth language rather than a TVM discount rate; and from a DCF or NPV calculator, which discounts a stream of cash flows at a rate you already chose. Keep present_value non-zero, keep periods strictly positive, pin the rounded percentage in tests, and you get a reproducible implied rate for homework, LMS plugins, and edge workers without standing up a full time-value-of-money engine of your own.
Integration use cases
Workbook and API parity
Recompute the implied rate when a future payout or a holding period changes, using the same pure module in the browser widget and the prepaid API.
Technical questions
What happens if present value is zero?
The task fails with invalid_input. present_value (aliases pv, present, principal) must be a finite number that is not zero, because r = (FV/PV)^(1/n) - 1 is undefined when present value is zero. Those failures are not billed.
What does the discount rate calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.