Double declining balance calculator
A 10,000 asset with a 1,000 salvage value and a 5-year life depreciates 4,000 in year one, then 2,400, 1,440, 864 and 296, ending exactly at 1,000. Enter cost, salvage and life to get the full schedule. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Cost
- 10,000
- Salvage
- 1,000
- Life years
- 5
- Decimal places
- 2
- Interest rate
- 0.4
- Rate percent
- 40
- Total depreciation
- 9,000
Double-declining-balance depreciation front-loads expense so early years carry a larger charge than straight-line for the same cost, salvage, and useful life. Accountants, controllers, and students need a reproducible year-by-year schedule that applies the classic rate of two over life years, multiplies that rate by the opening book value each period, and never drives book value below salvage. This double declining balance calculator accepts acquisition cost, residual salvage, and whole-year life, then returns the rate, a full schedule of beginning book, depreciation, accumulated depreciation, and ending book, plus total depreciation and final book value.
What double-declining balance means and how the schedule is built
Straight-line depreciation spreads the depreciable base of cost minus salvage evenly across every year of useful life. Double-declining balance does the opposite of that even spread: it takes the straight-line rate of one over n years and doubles it to two over n, then applies that constant percentage to the asset's book value at the start of each year.
Because book value falls after every charge, the same percentage produces a smaller absolute expense over time, which is exactly the front-loaded pattern many tax and management reports expect for equipment that loses productivity early. Critically, DDB multiplies the rate by book value, not by cost minus salvage, so salvage is enforced as a floor rather than as a numerator inside the rate.
Each year the engine computes a raw charge equal to opening book times two over life, then caps that charge at opening book minus salvage so residual value is never breached. If the remaining room to salvage is smaller than the percentage charge—as often happens near the end of life—the period expense is reduced to land exactly on salvage. When cost equals salvage, every year's depreciation is zero and the schedule still lists each year for a stable contract.
The formula string restates the rate and the min-with-salvage-floor rule so clients can show the method next to the table without re-deriving it.
What you can do with it
Fixed-asset depreciation rolls
Generate a year-by-year DDB table from cost, salvage, and life so books and internal reports share one schedule.
Classroom and exam checks
Mark homework that asks for double-declining rate and each period's depreciation with a deterministic salvage-floor oracle.
FAQ
What inputs are required?
Optional decimals (0–8, default 2) controls half-up money rounding.
Does DDB always reach salvage by the last year?
Not always under a pure percentage alone. This schedule caps each period so book never goes below salvage; late years may take a reduced charge to land on the floor.
Why is the rate applied to book value and not to cost minus salvage?
Because double declining balance takes a fixed percentage of the value still on the books each year. In the example, year one is 40% of 10,000, not of 9,000; salvage only works as a floor the value never drops below.
How does double declining compare with straight-line depreciation?
Straight-line spreads cost minus salvage evenly over the years. Double declining uses twice the straight-line rate on a falling book value, so the early years carry a larger charge and later years a smaller one.
What happens if cost and salvage are the same?
Every year's depreciation is zero, because there is nothing left to write off. The schedule still lists each year of the useful life, so the table keeps the same shape.
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/finance/depreciation-double-declining \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"cost":10000,"salvage":1000,"life_years":5}'const res = await fetch("https://api.kit.forhosting.com/finance/depreciation-double-declining", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"cost": 10000,
"salvage": 1000,
"life_years": 5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/depreciation-double-declining",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"cost": 10000,
"salvage": 1000,
"life_years": 5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/depreciation-double-declining", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"cost":10000,"salvage":1000,"life_years":5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"cost":10000,"salvage":1000,"life_years":5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/depreciation-double-declining", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"cost": 10000,
"salvage": 1000,
"life_years": 5
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.depreciation_double_declining",
"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
Rounding is half-up at a configurable decimals setting so spreadsheet checks and API automation agree. Invalid input fails with invalid_input and is not billed.
What double-declining balance means and how the schedule is built
The response echoes cost, salvage, life_years, and decimals; reports rate and rate_percent; and emits schedule rows with year, beginning_book, depreciation, accumulated_depreciation, and ending_book, plus total_depreciation and final_book_value.
Input contract, rounding, validation, and worked examples
An optional decimals integer from zero through eight defaults to two and controls half-up rounding applied to money fields in the schedule and to the echoed totals. Year one depreciation is four thousand against a ten thousand opening book, leaving six thousand. Year two takes forty percent of six thousand equals two thousand four hundred, and so on, until a later year is capped so ending book does not fall below one thousand. POST a JSON body with three required fields: cost, a finite number strictly greater than zero for the acquisition cost or depreciable start basis; salvage, a finite number greater than or equal to zero and less than or equal to cost for estimated residual value; and life_years, an integer from one through one hundred inclusive for useful life in whole years. Missing fields, empty strings, non-finite values, non-positive cost, negative salvage, salvage above cost, and life_years outside the integer range fail with invalid_input naming the issue, and those failures are not billed. Rate is computed as two divided by life_years in full precision for the loop; rate and rate_percent in the response are rounded for display stability. Example: cost ten thousand, salvage one thousand, life_years five yields a forty percent declining rate because two divided by five is zero point four. Example: cost fifty thousand, salvage five thousand, life_years eight produces a twenty-five percent rate and a longer schedule suitable for machinery ledgers. Pair the response with your own mid-year convention or half-year tax tables only if your jurisdiction requires them; this endpoint builds a full-year DDB table from the three classic inputs and does not switch methods mid-life or compute MACRS percentage tables.
Where a double declining balance calculator earns its keep
Controllers and fixed-asset clerks use a double declining balance calculator when preparing internal depreciation rolls that must match textbook DDB before any mid-year or partial-period convention is layered on. Students and LMS platforms need a deterministic oracle for homework that asks for the rate, each year's expense, accumulated depreciation, and book value without silent salvage-floor bugs. Failed validation does not consume balance. Spreadsheet migrations and ERP cutovers benefit from a pure JSON contract that regenerates the same schedule as a reference workbook when cost, salvage, and life match. Keep life_years in range, keep salvage at or below cost, pin rounded schedule rows in tests, and you get reproducible DDB tables for ledgers, n8n flows, and edge workers without standing up a full fixed-asset subsystem of your own.
Integration use cases
Automation and CMS widgets
Embed the same JSON contract in pipelines or on-page calculators so free previews match billed API results byte-for-byte.
Technical questions
How does the double declining balance calculator work?
It sets rate = 2 / life_years, then for each year charges min(beginning_book × rate, beginning_book − salvage) so book value never falls below salvage. Send cost, salvage, and life_years.
Is this the same as MACRS or mid-year convention?
No. This endpoint is classic full-year double-declining balance from cost, salvage, and life. It does not apply IRS MACRS tables or half-year conventions.
What does the double declining balance calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.