Methodology

How MoneyOtter calculates, rounds and checks

Every formula, convention and rounding rule behind the calculators, plus the tests they must pass. The same rules generate the “Show working” steps under each result.

Principles

  • Show the working. Each calculator returns an ordered list of steps with the formula, the inputs and the result. The “Show working” panel is built from that list, so it can’t drift from the figure it explains.
  • State assumptions. Every result lists the assumptions it relied on: the rate type and compounding, whether deposits come at the start or end of a period, the data series and its latest observation.
  • Never guess silently. Inputs outside documented limits are clamped with a visible message, never quietly truncated. Ambiguous numbers such as 85.000,50 typed on an English-language page are rejected with a message rather than read one way or the other.
  • Calculate, don’t advise. Comparisons are phrased “in this scenario”. Nothing on the site recommends a product, a lender or a decision.

Arithmetic and rounding

Money and rates are computed with exact decimal arithmetic (the decimal.js library at 50 significant digits), not the binary floating point that makes 0.1 + 0.2 come out as 0.30000000000000004. Amounts up to one trillion in major units keep every digit.

Rounding is explicit and documented per calculator. The default is half-up (ties away from zero) to the currency’s minor unit under ISO 4217: two decimals for most currencies, none for the Japanese yen or Korean won, three for the Kuwaiti dinar. A savings goal’s required deposit is rounded up, so that paying it actually reaches the goal. Charts are the only place figures are converted to ordinary numbers, purely to draw them.

Amounts are formatted with your browser’s locale (for example 1,234.50 or 1.234,50). Typing accepts thousands separators, currency symbols, a minus sign or brackets for negatives, and shorthand such as 85k or 1.2m.

Compound interest

Time runs on a grid of months, or weeks when deposits are weekly or fortnightly. The stated rate is converted to the exactly equivalent rate per step:

  • Effective annual rate (AER, APY, EAR): i = (1 + r)^(1/p) − 1, where p is steps per year.
  • Nominal rate compounded m times a year: i = (1 + r/m)^(m/p) − 1, which simplifies to r/p when compounding matches the grid; continuous compounding uses e^(r/p) − 1.

Between compounding dates interest accrues at that equivalent rate, the usual calculator convention. Deposits are whole minor units; the balance is carried at full precision and each schedule row is rounded so rows and columns reconcile exactly. Optional tax on growth is deducted from each year’s interest; the optional real value divides by (1 + inflation)^years. Example: $10,000.00 at 5% nominal compounded monthly for 10 years grows to $16,470.09.

Savings goal

To find the deposit needed, MoneyOtter solves PMT = (T − S·(1+i)^n) ÷ F, with F = ((1+i)^n − 1) ÷ i (multiplied by 1 + i for start-of-period deposits, and equal to n at a zero rate), then rounds up to the minor unit. “How long” simulates period by period until the balance first reaches the target, capped at 100 years, and says plainly when a goal can never be reached (for example no deposits and no growth). A target “in today’s money” grows as T × (1 + inflation)^(k/p).

Loans

Repayments use the standard annuity formula PMT = P × i ÷ (1 − (1 + i)^−n), rounded to the minor unit. Each period’s interest is round(balance × i); the final payment absorbs the rounding residual. Extra payments are applied after the scheduled payment and either shorten the term or lower the payment.

Two rate conventions are offered because lenders quote differently: nominal APR ÷ 12 (usual in the US and Canada) and APR as an effective annual rate, where i = (1 + APR)^(1/12) − 1 (the UK and EU “representative APR” basis). Example: $10,000.00 at 6% nominal over 60 months costs $193.33 a month, with a final payment of $193.21 and $1,599.68 of interest. Real lenders’ figures can differ because of fees, day-count conventions and their own rounding.

Mortgages

Mortgages use the same amortization engine with in-page presets. The standard preset charges annual rate ÷ 12 a month. The Canadian preset reflects fixed-rate mortgages compounded semi-annually, so the monthly rate is (1 + r/2)^(1/6) − 1: $300,000.00 at 5% over 25 years gives $1,744.81 a month. The UK preset flags overpayments above 10% of the balance in any mortgage year, a common allowance before early repayment charges (yours may differ). The US preset can add property tax, insurance, PMI and HOA dues to show a full monthly payment. Overpayment results are always shown next to the same mortgage without overpayments.

Inflation

The inflation calculator uses value_to = amount × CPI_to ÷ CPI_from with each publisher’s own index values, unmodified. Choosing a whole year uses the publisher’s own published annual average where there is one (BLS period M13, ONS annual figures), otherwise the mean of a complete calendar year; a year still in progress, or one with an unpublished month and no published average, gives an error. For 2025, BLS averaged the 11 months it published because October 2025 prices were never collected during the federal shutdown, and the calculator says so. An unpublished month is never interpolated. Cumulative inflation is CPI_to ÷ CPI_from − 1 and the average yearly rate is (CPI_to ÷ CPI_from)^(1/years) − 1. Dates outside a series give an error; nothing is extrapolated. A series is offered only when its licence allows reuse; 8 series currently qualify. Sources and licences are listed on the data page.

Currency conversion

Rates are the European Central Bank’s euro foreign exchange reference rates (units of each currency per euro, 29 currencies, from 1999-01-04). A conversion between two non-euro currencies uses the cross rate (B per EUR) ÷ (A per EUR) and is labelled “derived by MoneyOtter from ECB rates”, never presented as an ECB figure. Weekends and TARGET holidays use the previous business day’s rate, with a visible note. A few currencies with official fixed pegs to the US dollar or euro are converted through the peg published by their central bank. Bank or card charges are modelled as received = round((amount − fee) × rate × (1 − margin)). Reference rates are for information only, not rates you can trade at.

VAT, GST and sales tax

  • Adding tax: tax = round(net × rate), gross = net + tax.
  • Removing tax: net = round(gross ÷ (1 + rate)), tax = gross − net, so the parts always add up exactly.
  • Stacked taxes (such as GST plus Quebec QST) round each component separately when adding.
  • Several lines: tax rounded on each line (the default) or once per rate on the total.

The rate picker uses a sourced table checked against national and state tax authorities; see VAT and sales tax rates. US rows are state base rates only; you add your local rate.

Percentages

Each mode states its formula: X% of Y = Y × X ÷ 100; percentage change = (B − A) ÷ |A| × 100 (undefined when A is zero); reversing a percentage = final ÷ (1 ± X/100); stacked discounts multiply, so 20% then 10% off is 28% off in total; margin = (price − cost) ÷ price, markup = (price − cost) ÷ cost.

Salary to hourly

Pay is first converted to a yearly figure using your hours a week, days a week and paid weeks a year, then divided into every period. Fixed calendar divisors apply: bi-weekly = annual ÷ 26, four-weekly = annual ÷ 13, semi-monthly = annual ÷ 24, monthly = annual ÷ 12. Part-time (FTE) scales pay but not the hourly rate. All figures are before tax.

Income tax brackets

You supply a tax-free allowance and up to twelve bands. Income above the allowance is split across the bands and each slice is taxed at its band’s rate; the effective rate is tax ÷ income and the marginal rate is the rate on the next unit of income. Bands that overlap or run backwards are rejected with a message naming the band. These are your rules, not ours: MoneyOtter hasn’t checked them for any country.

How we test

  • Known answers. Each calculator must reproduce the worked examples in our specification to the cent, for example 10,000 at 5% compounded yearly for 10 years = 16,288.95, and removing 20% VAT from 99.99 = 83.33 + 16.66.
  • Property tests. Randomized tests check invariants, for example that principal repaid always equals the amount borrowed and that currency conversions round-trip within rounding.
  • Browser tests. Every calculator page is tested in a real browser and its on-screen figures compared with the engine called directly, and we check that no figure you type appears in any network request.

How countries are verified

A country take-home calculator moves through readiness levels — Candidate → Sources identified → Rules being drafted → Engine and test cases → Independent cross-check → Live — and gets a page only at the last one. Getting there needs rules files where every rate, threshold and allowance cites an official source with the date it was read; at least 30 test cases per tax year, at least five of them official worked examples or captured official-calculator results; an independent re-implementation written from the sources without reading our code that agrees on at least 2,000 random cases; and a second-person review of every value. Status for each country is on the countries page.

Reporting errors

If a figure, rate or explanation looks wrong, email errors@moneyotter.com with the calculator, the inputs and what you expected. Corrections are dated in the changelog.