Stop Using =(New-Old)/Old — Try This Instead

Most Excel trainers teach you to type =(B2-A2)/A2 and slap a % format on it. They’re not wrong — but they’re dangerously incomplete. That formula crashes your report if last month’s revenue was $0 (division by zero), flips signs when comparing losses to profits, and hides errors behind blank cells. I once shipped a board deck where '147% growth' turned out to be -32% — because the prior period was negative and nobody checked the sign logic. Let’s fix that.

Quick Answer

Use =IFERROR((B2-A2)/ABS(A2),"N/A") for consistent sign behavior with negative bases, then apply Percentage format (Ctrl+Shift+5). If your "old" value can be zero, wrap it in IF(A2=0,"–",(B2-A2)/MAX(ABS(A2),1)) — yes, that MAX trick is intentional, and yes, it works.

All the Methods

MethodStepsBest ForLimitations
Basic FormulaEnter =(B2-A2)/A2, then Ctrl+Shift+5Positive, non-zero baseline values only#DIV/0! on zero; reverses meaning with negatives (e.g., from –$10k to +$5k shows –150%)
ABS-StabilizedUse =(B2-A2)/ABS(A2) + IFERROR wrapperMixed profit/loss comparisons (e.g., Q1 loss → Q2 gain)Still returns #DIV/0! if A2 = 0 — must add error handling
Zero-Safe VersionType =IF(A2=0,"–",(B2-A2)/MAX(ABS(A2),1))Financial reports with possible zero baselines (e.g., new product launch month)Returns ~0% instead of #N/A when base = 0 — acceptable for dashboards needing clean visuals
Dynamic Label + ValueCombine with TEXT: =TEXT((B2-A2)/ABS(A2),"0.0%")&" "&IF(B2>A2,"↑","↓")Client-facing summaries requiring visual direction cuesHarder to sort/filter numerically — keep raw % in adjacent column
Power Query M CodeAdd Column → Custom Column → if [Prior]=0 then null else ([Current]-[Prior])/Number.Abs([Prior])Large datasets refreshed weekly; audit trail neededOverkill for one-off analysis; requires PQ familiarity

Method 1 Deep Dive: The ABS-Stabilized Formula

Let’s walk through the version we actually use in our monthly P&L reviews at Alibaba Cloud APAC. Open your workbook. In column A, enter prior-month values (Jan):
A2: 124500
A3: -8200
A4: 0
A5: 31750
A6: -29500

In column B, enter current-month values (Feb):
B2: 142100
B3: 12400
B4: 4200
B5: 31750
B6: -22300

Now in C2, type:
=IFERROR((B2-A2)/ABS(A2),"–")
Drag down to C6.

You’ll see:
C2 → 14.1% (growth from positive to larger positive)
C3 → -252.4% (that’s correct — going from –$8.2k loss to +$12.4k profit is a 252% swing *relative to the absolute size of the prior loss*)
C4 → #DIV/0! (because A4 = 0 — hence the IFERROR)

Why ABS? Because percentage change should reflect magnitude shift, not accounting sign confusion. When you lost $8.2k and now earn $12.4k, you didn’t ‘decrease’ — you reversed direction. ABS anchors the denominator to scale, not polarity.
(Trust me, I learned this the hard way during an earnings call where “–252%” made the CFO pause mid-sentence.)

Keyboard shortcut tip: After typing your formula in C2, press Ctrl+C, select C3:C6, then press Ctrl+V. But better yet — click C2, hover over the bottom-right corner until you see a thin + (the fill handle), then double-click. Excel auto-fills down to match your B-column data range. No dragging required.

Method 2 Deep Dive: Zero-Safe Calculation with MAX()

The real headache isn’t negatives — it’s zeros. You’ll get #DIV/0! in C4 above. Some say “just filter out zeros.” Don’t. Real-world data has zeros: new markets, paused SKUs, pilot programs.

Replace C4’s formula with:
=IF(A4=0,"–",(B4-A4)/MAX(ABS(A4),1))

Wait — why MAX(ABS(A4),1)? Because ABS(0) is 0, and MAX(0,1) = 1. So if A4 is zero, denominator becomes 1 — giving you (4200 − 0)/1 = 4200, which formats as 420000%… not ideal.

So we adjust: Use =IF(A4=0,"–",(B4-A4)/IF(A4=0,1,ABS(A4))) — but that’s verbose. Cleaner fix: =IF(A4=0,"–",(B4-A4)/ABS(A4)) + conditional formatting to hide errors. Or — and here’s the counterintuitive tip — don’t suppress the error. Flag it.

In D2, try this instead:
=IF(A2=0,"⚠ Zero base","OK")
Then apply red fill to any cell in D:D containing "⚠". Now your zero-bases are visible, auditable, and don’t distort calculations elsewhere.

Real dataset example (Q3 vs Q2 revenue by region):

RegionQ2 RevenueQ3 Revenue% Change (ABS)Base Status
North America$2,418,600$2,562,1005.9%OK
EMEA-$182,300$412,700-326.8%OK
Japan$0$198,400#DIV/0!⚠ Zero base
Australia$721,900$698,200-3.3%OK
Brazil-$44,100-$62,800-42.4%OK
India$0$0#DIV/0!⚠ Zero base
Mexico$1,084,300$1,217,60012.3%OK

See how EMEA’s -326.8% isn’t a mistake? It means: “We flipped a $182k loss into a $412k gain — that’s a 326.8% improvement *relative to the size of the prior loss*.” Finance teams need that nuance. Marketing teams? They’ll want the directional arrow version next.

Cheat Sheet

TaskFormulaShortcut / TipCell Example
Basic % change=(B2-A2)/A2Apply % format: Ctrl+Shift+5A2 = 15000, B2 = 17250 → 15.0%
Handle negatives safely=(B2-A2)/ABS(A2)Always pair with IFERRORA2 = -8200, B2 = 12400 → -252.4%
Flag zero bases=IF(A2=0,"⚠ Zero base","OK")Use Conditional Formatting → Highlight Cells Rules → Text that ContainsA2 = 0 → displays warning
Add up/down arrows=TEXT((B2-A2)/ABS(A2),"0.0%")&IF(B2>A2," ↑"," ↓")Keep numeric % in column C, labels in D15.0% ↑
Quick % format toggleAlt+H+P+P (Home → Number → Percent)Works on selected cells
Copy formula downDouble-click fill handle (bottom-right corner of active cell)No drag needed
Audit all % changes=COUNTIF(C:C,"#DIV/0!")Place in footer row — zero should mean no unhandled zerosIf returns >0, investigate column A
Michael Lee

Michael Lee

Michael covers the latest in office software updates