At some point you do the multiplication yourself. Fat times 9, carbs times 4, protein times 4, and the number you get isn't the number printed on the box. It's close, but it's out by thirty calories, or by two hundred calories, and there's no note anywhere explaining which figure you're supposed to believe.
The natural conclusion is that somebody made a mistake. Usually nobody did.
That formula is an approximation. It's a good one, and most tracking guides hand it over as though it were arithmetic rather than an estimate, but it disagrees with honest labels constantly. What's worth learning is that the direction it disagrees in tells you almost everything about whether to worry.
Protein and fat aren't worth exactly 4 and 9
The 4/4/9 figures are the general Atwater factors, averaged across whole categories of food. The people who actually measure this use food-specific ones instead: protein in meat gets priced at 4.27 rather than 4, fat at 9.02, protein in eggs at 4.36.
So a lean, high-protein food legitimately carries a few percent more energy than the formula predicts. Six ounces of roasted chicken breast is about 280 calories, against macros of 6g fat, 0g carbs and 53g protein that multiply out to roughly 266 calories. Nothing is wrong with either number. The gap is the distance between a general factor and a measured one.
This is the case people most often "correct", and it's the one you should leave alone. A plain single-ingredient food is where the numbers came from a real measurement, so it's the last place you should be adjusting them to satisfy a rule of thumb.
Fibre breaks it much harder, and the other way
In the US, fibre has to be declared inside total carbohydrate — but it doesn't have to be charged like carbohydrate. A manufacturer can work out the calorie figure using factors that give fibre far less than 4 calories a gram, and for insoluble fibre close to none, which is roughly what you actually get from it. Your multiplication knows none of that. It sees one carbohydrate number and charges the whole thing at 4.
So a high-fibre food's label sits below what its own macros compute, sometimes dramatically. A store-brand bran cereal in the USDA database runs 225 calories per 100g against 3.8g fat, 82.5g carbs and 7.5g protein. Multiply those out and you get 394 calories. The label says 225 calories, and the label is right. The 169-calorie difference is roughly 42g of fibre that your arithmetic charged full price for and the manufacturer charged almost nothing for.
That's a far bigger disagreement than the chicken, and it's completely honest. It's also the reason you can't just tighten the rule until things match: anything strict enough to catch a real typo would throw out every high-fibre food on the shelf.
Alcohol is in none of the three
Alcohol carries about 7 calories per gram and appears in no macro at all. A five-ounce glass of red wine is roughly 124 calories with about 4g of carbs and no fat or protein worth counting. Multiply the macros and you get 16 calories.
There's no way to infer that from the three macros, because the calories are somewhere the three macros can't see. A drink is the one case where the numbers can't be reasoned about at all and simply have to be taken as given.
So: which way does it lean?
That's the whole practical skill, and it's smaller than it sounds.
A little over, on meat, fish or eggs. That's the formula being approximate and the label being accurate. Leave it.
Under, sometimes by a lot, on something with real fibre in it. Also fine. The gap is roughly the fibre your arithmetic charged for and the label didn't.
Well over, on anything that isn't a drink. Worth a look. Nothing makes a food carry meaningfully more energy than its macros account for, so a calorie figure sitting well above them usually means somebody guessed it rather than measured it.
Under by more than about double. This is the one that actually costs you. Macros that multiply to more than roughly twice the stated calories usually mean a whole meal got filed under a snack's calorie count, which quietly under-counts the day by hundreds of calories. It's also why a loose tolerance in that direction still needs a limit.
None of this makes tracking harder. It's an argument against one specific instinct, which is to "fix" a label until it agrees with the multiplication. The multiplication is the approximation. The label was measured.
What Graham does with this
I ended up writing this rule into the app, and the shape of it follows from everything above.
The check that decides whether a log's numbers can live together is deliberately lopsided, because food is. A calorie count sitting above what its macros support gets about 8% of slack — or 20 calories, whichever is larger, so small entries are looser still — sized so that lean meat and eggs pass. Below, the tolerance is far wider, because that's where fibre lives, and it only trips when the macros imply more than roughly double what was stated. Drinks skip the check entirely and have to say so.
The part I'd defend hardest is what happens when it refuses something. It doesn't tell Graham what the number should have been. The entry that prompted all of this was six ounces of chicken at 280 calories against 5g of fat, and the honest correction there was 6.1g of fat, not 253 calories — but calories are the easier figure to overwrite, so handing one back would teach a system to shave calories off every lean-protein entry until the arithmetic closed. It would look like it was getting more accurate while drifting away from the food. Both halves of a mismatch are suspects, and settling it means going back to where the figures came from — the label on the packet, or the database entry the portion was scaled from — rather than trusting whichever number is easier to overwrite.
— Ryan