acuno · Tools · Compound interest · How it works

How the calculator 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
  1. 01What the tool projects
  2. 02The inputs
  3. 03The calculation, step by step
  4. 04Worked example 1: one year
  5. 05Worked example 2: the default scenario
  6. 06The derived figures
  7. 07Compare mode and the presets
  8. 08Limits and edge cases
  9. 09Reproduce it yourself

01

What the tool projects

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

  • Volatility. Every month grows at the same rate.
  • Taxes. No capital gains tax, withholding tax or allowance is deducted.
  • Costs beyond the fund costs. No order fees, spreads or account fees.
  • Currency effects. Each preset is applied as an annual return in your currency.
  • Forecasts. The presets are historical averages, not predictions.

02

The inputs

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.

Starting amount

Money invested at the beginning, before the first month. It counts as paid in.

Range: €0 – €10,000,000Default: €1,000.00

Monthly contribution

Added at the start of every month, before that month’s growth. Twelve contributions per year.

Range: €0 – €100,000Default: €200.00

Horizon

The number of years to project. The result covers whole years only.

Range: 1 – 50 yearsDefault: 30 years

Market

A preset sets the annual return and, for index presets, the default fund costs. Custom lets you enter your own return.

Default: MSCI World

Return p.a.

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%

Fund costs (TER)

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%

Increase contribution yearly

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%

Show in today’s money

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

Inflation assumption

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 calculation, step by step

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.

Units and rounding

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.00

Fund costs

Costs 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%

From annual to monthly return

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.0054973671

One month

Each 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.

The first month of the default scenario, written out:
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.00

Yearly contribution increase

With 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.

With an increase of 3.0% per year, the contribution in year 10:
C(y) = round(C(1) × (1 + g)^(y − 1), 2)
C(10) = round(€200.00 × (1 + 0.03)^9, 2) = €260.95

Today’s money

With 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.

The last year of the default scenario in today’s money:
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.62

Symbols

r
annual return before costs
ter
fund costs per year
r_net
annual return after costs
m
monthly rate
g
yearly contribution increase
i
inflation assumption
y
year, counted from 1
n
number of months, years × 12
B
balance; B(0) is the starting amount, B(k) the balance after month k
C
monthly contribution; C(y) is the contribution in year y

04

Worked example 1: one year

€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.

Month 1, written out:
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
Worked example 1: one year
MonthContributionAfter contributionAfter growthPaid 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

Worked example 2: the default scenario

€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

Year by year

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 by year
YearPaid inGrowthBalance
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
Show all 30 years +
Show all 30 years
YearPaid inGrowthBalance
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 formula shortcut

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.11

The 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

The derived figures

Three figures are read off the year-by-year points. The default scenario is substituted on the right.

Growth share

Growth divided by the end value. Zero when the end value is zero or negative.

€160,881.39 ÷ €233,881.39 = 68.79%

Crossover year

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

Growth in the final third

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%

The insight sentences

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.

Growth outweighs paid-in

Shown whenever a crossover year exists.

Cost of waiting

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.

Versus a savings account

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.

The final third

Shown for horizons of 9 years or more with positive growth. Reports the last-third share from above.

In today’s money

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.

No growth

Replaces every other sentence when the return after costs is zero or below and there is no growth.

No sentences

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:

  • 01From year 19 on, growth outweighs what you paid in.
  • 02Starting 10 years later, you would need about €461 per month instead of €200 for the same result.
  • 03In a savings account at 1.5%, the same payments end at about €92,386, a difference of €141,495.
  • 04The final 10 years produce 66% of all growth.
  • 05In today's purchasing power that is about €129,119.

07

Compare mode and the presets

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.

End value by market
MarketReturn p.a.End valueGrowthMultiple
MSCI World7.0%€233,881.39€160,881.393.2×
S&P 5009.0%€342,562.05€269,562.054.7×
MSCI Emerging Markets7.0%€233,881.39€160,881.393.2×
STOXX Europe 6006.5%€213,079.86€140,079.862.9×
Savings account1.5%€92,386.20€19,386.201.3×

Where the preset figures come from

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.

MSCI World

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%

S&P 500

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%

MSCI Emerging Markets

Large and mid-sized companies across 24 emerging economies. MSCI Emerging Markets net total return since 1988.

Return p.a.: 7.0%

STOXX Europe 600

600 companies across 17 European countries. STOXX Europe 600 gross return since 1987.

Return p.a.: 6.5%

Savings account

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

Limits and edge cases

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.

Out-of-range values

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.

Negative returns

A custom return below zero shrinks the balance every month. Growth turns negative and the chart marks the shortfall below paid in.

Zero net return

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.

Nothing to project

With neither a starting amount nor a contribution every figure is zero, and the tool asks for an input instead of showing insights.

Display rounding

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

Reproduce it yourself

Two ways. The spreadsheet gives the tool’s figures to the cent; the formula gets within a few cents.

Spreadsheet, exact

  1. 01Put the annual return after costs in a cell as a decimal: return minus fund costs, divided by 100.
  2. 02Monthly rate in a second cell: =(1 + rate)^(1/12) − 1. Keep full precision; do not round it.
  3. 03Row 0: balance = starting amount, paid in = starting amount.
  4. 04One row per month: balance = ROUND((previous balance + contribution) × (1 + monthly rate); 2). Paid in = previous paid in + contribution.
  5. 05With a yearly increase: the contribution for the months of year y is ROUND(first contribution × (1 + increase)^(y − 1); 2).
  6. 06Read the year-end rows, every twelfth row. Growth = balance − paid in. End value is the last row.
  7. 07For today’s money: divide each year-end balance by (1 + inflation)^y and round to cents. Paid in: starting amount plus each year’s twelve contributions divided by that year’s (1 + inflation)^y, summed, rounded once at the end.

Formula, within 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