acuno · Tools · Compound interest · How it works
Every figure in the compound interest tool follows from a handful of fixed rules. This page states them, works through two examples step by step, and shows how to reproduce the results yourself, to the cent.
Open the calculator →01
The tool projects a savings plan: a starting amount, a monthly contribution and a horizon in years, growing at one constant annual return. It reports the end value, how much of it you paid in, and how much is growth.
The return is a long-run average, applied evenly month after month. Real markets do not behave like this. A broad index can lose a third of its value in one year and recover over the next few. Over long horizons the average is what shows up, but the path there is never a smooth curve.
All figures on this page are computed by the same code the calculator runs, at the moment you load the page. If the calculator changes, this page changes with it.
Not modelled
02
Nine settings define a scenario. Four are always visible; the rest sit under Advanced. A value outside its range is brought back inside it, never rejected.
Money invested at the beginning, before the first month. It counts as paid in.
Range: €0 – €10,000,000Default: €1,000.00
Added at the start of every month, before that month’s growth. Twelve contributions per year.
Range: €0 – €100,000Default: €200.00
The number of years to project. The result covers whole years only.
Range: 1 – 50 yearsDefault: 30 years
A preset sets the annual return and, for index presets, the default fund costs. Custom lets you enter your own return.
Default: MSCI World
The nominal annual return used when the market is set to Custom. It is an annualised figure: the tool derives a monthly rate from it such that twelve months of growth equal exactly this return.
Range: -20.0% – 30.0%Default: 5.0%
The fund’s total expense ratio. Subtracted from the annual return before anything else is calculated.
Range: 0.0% – 5.0%Default: 0.2% · Savings account, Custom: 0.0%
Raises the monthly contribution once a year, at the start of each new year, by this percentage of the previous year’s contribution.
Range: 0.0% – 20.0%Default: 0.0%
Switches the output from nominal euros to today’s purchasing power. The projection itself does not change; its yearly results are deflated afterwards.
Default: off
The annual inflation rate used for today’s money. Ignored while the switch is off.
Range: 0.0% – 15.0%Default: 2.0%
03
The tool runs one loop, month after month, for every year of the horizon. Each rule below is one step in that loop. The second line of every formula substitutes the default scenario.
All amounts are whole cents and all rates are whole basis points; one basis point is a hundredth of a percent. After every month the balance is rounded to whole cents, with half a cent rounding up. This is why a spreadsheet that rounds each month reproduces the tool exactly, while a closed formula lands a few cents away.
1 bp = 0.01 %
1 € = 100 ct
r = 700 bp = 7.0%
B(0) = 100,000 ct = €1,000.00Costs are a plain subtraction. The TER comes off the annual return, and the monthly rate is derived from the net figure. An index preset with costs is projected exactly like a costless preset at the net rate. The savings account preset carries no costs.
r_net = r − ter
r_net = 7.0% − 0.2% = 6.8%The annual return is first reduced by the fund costs. The monthly rate is then the twelfth root of the annual growth factor, not a twelfth of the rate. Twelve months at this rate compound to exactly one year at the net return.
m = (1 + r_net)^(1/12) − 1
m = (1 + 0.068)^(1/12) − 1 = 0.0054973671Each month the contribution is added first. Then the whole balance grows by the monthly rate. Then the result is rounded to whole cents. The contribution is also added to the running paid-in total.
B(k) = round((B(k−1) + C(y)) × (1 + m), 2)
paid_in(k) = paid_in(k−1) + C(y)
B(1) = round((€1,000.00 + €200.00) × 1.0054973671, 2) = €1,206.60
paid_in(1) = €1,000.00 + €200.00 = €1,200.00With a yearly increase, the contribution stays constant within a year and steps up at the start of each new year. The contribution in a given year is the first year’s contribution times the growth factor raised to the number of completed years, rounded to whole cents. The default scenario has no increase, so the second line shows a different setting.
C(y) = round(C(1) × (1 + g)^(y − 1), 2)
C(10) = round(€200.00 × (1 + 0.03)^9, 2) = €260.95With the switch on, the loop runs unchanged in nominal euros. Each year-end balance is then divided by the inflation factor for that year. Paid-in is deflated the same way, year by year: the starting amount counts in full, and each year’s twelve contributions are divided by that year’s factor. Real growth is the difference of the two deflated figures, so at a return equal to inflation the real growth is zero.
B_real(y) = round(B(12·y) / (1 + i)^y, 2)
paid_in_real(y) = B(0) + Σ(k = 1..y) 12 × C(k) / (1 + i)^k
growth_real(y) = B_real(y) − round(paid_in_real(y), 2)
B_real(30) = round(€233,881.39 / (1 + 0.02)^30, 2) = €129,119.11
paid_in_real(30) = €54,751.49
growth_real(30) = €129,119.11 − €54,751.49 = €74,367.62Symbols
04
€1,000.00 to start, €100.00 per month, one year, a custom return of 6.0%, no fund costs. Twelve months, one row each.
m = (1 + r)^(1/12) − 1
B(1) = round((B(0) + C) × (1 + m), 2)
m = (1 + 0.06)^(1/12) − 1 = 0.0048675506
B(1) = round((€1,000.00 + €100.00) × 1.0048675506, 2) = €1,105.35| Month | Contribution | After contribution | After growth | Paid in |
|---|---|---|---|---|
| 1 | €100.00 | €1,100.00 | €1,105.35 | €1,100.00 |
| 2 | €100.00 | €1,205.35 | €1,211.22 | €1,200.00 |
| 3 | €100.00 | €1,311.22 | €1,317.60 | €1,300.00 |
| 4 | €100.00 | €1,417.60 | €1,424.50 | €1,400.00 |
| 5 | €100.00 | €1,524.50 | €1,531.92 | €1,500.00 |
| 6 | €100.00 | €1,631.92 | €1,639.86 | €1,600.00 |
| 7 | €100.00 | €1,739.86 | €1,748.33 | €1,700.00 |
| 8 | €100.00 | €1,848.33 | €1,857.33 | €1,800.00 |
| 9 | €100.00 | €1,957.33 | €1,966.86 | €1,900.00 |
| 10 | €100.00 | €2,066.86 | €2,076.92 | €2,000.00 |
| 11 | €100.00 | €2,176.92 | €2,187.52 | €2,100.00 |
| 12 | €100.00 | €2,287.52 | €2,298.65 | €2,200.00 |
After twelve months the balance is €2,298.65. Paid in: €2,200.00. Growth: €98.65. These are the three tiles the tool shows for this scenario, rounded to whole euros.
Open this scenario in the calculator →05
€1,000.00 to start, €200.00 per month, 30 years, MSCI World at 7.0% p.a. with 0.2% fund costs, so 6.8% net. This is what the tool shows when you open it.
The three tiles, to the cent:
End value
€233,881.39
30 years · nominal
Paid in
€73,000.00
€1,000.00 + 360 × €200.00
Growth
€160,881.39
68.79% of the end value
Selected years. Paid in is the starting amount plus twelve contributions per completed year; growth is balance minus paid in. In year 19 growth overtakes paid-in for the first time.
| Year | Paid in | Growth | Balance |
|---|---|---|---|
| 0 | €1,000.00 | €0.00 | €1,000.00 |
| 1 | €3,400.00 | €155.52 | €3,555.52 |
| 5 | €13,000.00 | €2,637.59 | €15,637.59 |
| 10 | €25,000.00 | €10,976.37 | €35,976.37 |
| 15 | €37,000.00 | €27,236.94 | €64,236.94 |
| 18 | €44,200.00 | €42,034.10 | €86,234.10 |
| 19 | €46,600.00 | €47,985.53 | €94,585.53 |
| 20 | €49,000.00 | €54,504.85 | €103,504.85 |
| 25 | €61,000.00 | €97,067.28 | €158,067.28 |
| 30 | €73,000.00 | €160,881.39 | €233,881.39 |
| Year | Paid in | Growth | Balance |
|---|---|---|---|
| 0 | €1,000.00 | €0.00 | €1,000.00 |
| 1 | €3,400.00 | €155.52 | €3,555.52 |
| 2 | €5,800.00 | €484.82 | €6,284.82 |
| 3 | €8,200.00 | €999.70 | €9,199.70 |
| 4 | €10,600.00 | €1,712.80 | €12,312.80 |
| 5 | €13,000.00 | €2,637.59 | €15,637.59 |
| 6 | €15,400.00 | €3,788.46 | €19,188.46 |
| 7 | €17,800.00 | €5,180.79 | €22,980.79 |
| 8 | €20,200.00 | €6,830.97 | €27,030.97 |
| 9 | €22,600.00 | €8,756.60 | €31,356.60 |
| 10 | €25,000.00 | €10,976.37 | €35,976.37 |
| 11 | €27,400.00 | €13,510.27 | €40,910.27 |
| 12 | €29,800.00 | €16,379.66 | €46,179.66 |
| 13 | €32,200.00 | €19,607.40 | €51,807.40 |
| 14 | €34,600.00 | €23,217.81 | €57,817.81 |
| 15 | €37,000.00 | €27,236.94 | €64,236.94 |
| 16 | €39,400.00 | €31,692.57 | €71,092.57 |
| 17 | €41,800.00 | €36,614.40 | €78,414.40 |
| 18 | €44,200.00 | €42,034.10 | €86,234.10 |
| 19 | €46,600.00 | €47,985.53 | €94,585.53 |
| 20 | €49,000.00 | €54,504.85 | €103,504.85 |
| 21 | €51,400.00 | €61,630.68 | €113,030.68 |
| 22 | €53,800.00 | €69,404.29 | €123,204.29 |
| 23 | €56,200.00 | €77,869.69 | €134,069.69 |
| 24 | €58,600.00 | €87,073.94 | €145,673.94 |
| 25 | €61,000.00 | €97,067.28 | €158,067.28 |
| 26 | €63,400.00 | €107,903.37 | €171,303.37 |
| 27 | €65,800.00 | €119,639.52 | €185,439.52 |
| 28 | €68,200.00 | €132,336.92 | €200,536.92 |
| 29 | €70,600.00 | €146,060.94 | €216,660.94 |
| 30 | €73,000.00 | €160,881.39 | €233,881.39 |
The loop has a closed form: the starting amount compounded over all months, plus the future value of an annuity due, a series of equal payments made at the start of each period. It skips the monthly rounding, so it lands close to the tool but not on it.
n = years × 12
end ≈ B(0) × (1 + m)^n + C × ((1 + m)^n − 1) / m × (1 + m)
n = 30 × 12 = 360
(1 + m)^n = 1.0054973671^360 = 7.196769
end ≈ €1,000.00 × 7.196769 + €200.00 × (7.196769 − 1) / 0.0054973671 × 1.0054973671 = €233,881.11The tool shows €233,881.39; the formula gives €233,881.11. The difference of €0.28 comes from rounding the balance to whole cents after each of the 360 months.
Open this scenario in the calculator →06
Three figures are read off the year-by-year points. The default scenario is substituted on the right.
Growth divided by the end value. Zero when the end value is zero or negative.
€160,881.39 ÷ €233,881.39 = 68.79%
The first year in which growth is larger than paid in. Empty when it never happens within the horizon.
Year 19€47,985.53 > €46,600.00
The share of all growth that arrives in the last third of the horizon. The split point is two thirds of the horizon, rounded down to a whole year; the final third is what remains. Zero when there is no growth.
the final 10 of 30 years(€160,881.39 − €54,504.85) ÷ €160,881.39 = 66.12%
Below the chart the tool shows up to three sentences, chosen in the order below. Each one is either a figure from the table above or one more run of the same loop with one input changed. The compact view inside a lesson shows only the first.
Shown whenever a crossover year exists.
Shown for horizons of 15 years or more with a monthly contribution. The tool searches for the monthly contribution that reaches the same end value with a start 10 years later: same starting amount, return and costs, horizon shortened by 10 years. The search halves the interval between zero and the maximum contribution until the result is exact to the cent, then reports the contribution needed.
Shown for every market except the savings account. The same inputs are projected at the savings preset’s rate without fund costs; the sentence reports that end value and the difference to yours.
Shown for horizons of 9 years or more with positive growth. Reports the last-third share from above.
Shown while the today’s-money switch is off. The scenario is projected once more with the inflation assumption applied, and the sentence reports that end value.
Replaces every other sentence when the return after costs is zero or below and there is no growth.
When the end value is zero or negative, and when both the starting amount and the contribution are zero.
For the default scenario all five apply, in this order. The tool shows the first three:
07
Compare projects every preset with your starting amount, contribution and horizon. Only the return changes.
Index presets use the fund costs from your scenario. The savings account always runs without costs. A custom return is not part of the comparison. Multiple is the end value divided by paid in.
| Market | Return p.a. | End value | Growth | Multiple |
|---|---|---|---|---|
| MSCI World | 7.0% | €233,881.39 | €160,881.39 | 3.2× |
| S&P 500 | 9.0% | €342,562.05 | €269,562.05 | 4.7× |
| MSCI Emerging Markets | 7.0% | €233,881.39 | €160,881.39 | 3.2× |
| STOXX Europe 600 | 6.5% | €213,079.86 | €140,079.86 | 2.9× |
| Savings account | 1.5% | €92,386.20 | €19,386.20 | 1.3× |
Long-run annualised total return (dividends reinvested), rounded down. Averages depend on the period measured; the tool uses them as a reference, not a forecast. The inflation assumption of 2.0 % p.a. is the ECB target. Figures last verified 2026-09-09.
About 1,400 large and mid-sized companies across 23 developed markets. MSCI World net total return, long run since the 1970s, in EUR, rounded down.
Return p.a.: 7.0%
The 500 largest listed companies in the United States. S&P 500 total return since 1957, in USD; EUR-adjusted is slightly lower.
Return p.a.: 9.0%
Large and mid-sized companies across 24 emerging economies. MSCI Emerging Markets net total return since 1988.
Return p.a.: 7.0%
600 companies across 17 European countries. STOXX Europe 600 gross return since 1987.
Return p.a.: 6.5%
A typical Austrian overnight deposit rate. Changes with policy rates; editable. Snapshot of typical overnight deposit offers.
Return p.a.: 1.5%
Index names identify the index only. acuno is not affiliated with the index providers.
08
The engine never rejects an input. It brings values inside their range and rounds them to whole cents, whole basis points and whole years before the loop starts.
A value above its maximum is replaced by the maximum, a value below its minimum by the minimum. The ranges are listed under The inputs. A shared link with an unknown market falls back to the default market.
A custom return below zero shrinks the balance every month. Growth turns negative and the chart marks the shortfall below paid in.
When the return after costs is zero or below and nothing has grown, the balance is at most what you paid in. The tool then shows the No growth sentence instead of the insights.
With neither a starting amount nor a contribution every figure is zero, and the tool asks for an input instead of showing insights.
The engine keeps cents. The tool’s tiles, chart and sentences round to whole euros for display, so a tile can sit up to fifty cents away from the to-the-cent figure on this page. Percentages are kept in whole basis points and shown with one decimal or none.
09
Two ways. The spreadsheet gives the tool’s figures to the cent; the formula gets within a few cents.
Use the closed form from example 2 with n = years × 12 and the monthly rate m. It ignores the monthly rounding and the yearly contribution increase. Expect a difference of a few cents over long horizons, and a larger one when an increase is set.
These figures are a model projection from historical long-run averages. Past performance does not predict future returns. This is education, not investment advice.
Open the calculator