macOS says my battery is at 94%. The gauge inside it says 91.49%.
Settings shows one battery health figure. The battery controller stores three, and the one macOS picks is the most flattering of them. Here is the arithmetic on a MacBook Pro at 190 cycles.
Settings on this MacBook Pro reports a battery Maximum Capacity of 94%. The gauge chip inside the battery reports 91.49%. Both figures were read within the same minute, from the same machine, and neither is a bug. macOS displays a smoothed capacity estimate and rounds it; the raw reading is the unsmoothed one. The gap on this machine is 2.43 percentage points at 190 cycles.
That gap matters if you are watching a battery decline and trying to work out whether it has crossed a threshold, because the number Apple shows you moves later and in coarser steps than the number the hardware actually holds.
What the controller actually stores
The battery in an Apple Silicon Mac is not a passive cell. It carries a controller that tracks charge, temperature, impedance and a running estimate of how much capacity remains relative to when it was new. That controller publishes its state through the IOKit registry, and you can read it without installing anything:
ioreg -rn AppleSmartBattery | grep -oE '"(DesignCapacity|NominalChargeCapacity|AppleRawMaxCapacity|MaxCapacity|CycleCount)" = [0-9]+'
On this machine, that returns four values that matter and one that does not:
| Field | Value | What it is |
|---|---|---|
DesignCapacity |
6249 mAh | Rated capacity when the cell was manufactured |
NominalChargeCapacity |
5869 mAh | The controller’s smoothed estimate of usable capacity |
AppleRawMaxCapacity |
5717 mAh | The unsmoothed gauge reading |
CycleCount |
190 | Completed charge cycles |
MaxCapacity |
100 | Normalised, and not a health figure |
Three of those are capacities in milliamp-hours against the same denominator, so they can be turned into percentages directly.
The arithmetic
Dividing each capacity by DesignCapacity gives:
NominalChargeCapacity 5869 / 6249 = 0.93919 -> 93.92%
AppleRawMaxCapacity 5717 / 6249 = 0.91487 -> 91.49%
Now compare that against what the operating system puts on screen:
system_profiler SPPowerDataType | grep -iE "cycle count|condition|maximum capacity"
Cycle Count: 190
Condition: Normal
Maximum Capacity: 94%
93.92% rounds to 94%. So the figure in Settings is NominalChargeCapacity / DesignCapacity, rounded to the nearest whole number. It is not the raw gauge value, which would have displayed as 91%.
That is the whole finding, and it is checkable on any Apple Silicon Mac in about fifteen seconds.
Why there are two capacities at all
A battery gauge does not measure stored energy directly. It infers it, from voltage under load, from accumulated current in and out, and from a model of the cell’s internal resistance that it updates as the pack ages. Those inputs are noisy. Temperature alone moves the apparent capacity by a few percent, which is why a cold laptop reports a worse battery than the same laptop an hour later.
AppleRawMaxCapacity is close to that raw inference. It moves between readings, sometimes by tens of milliamp-hours, because the underlying estimate moves.
NominalChargeCapacity is the controller’s filtered version of the same quantity. It updates more slowly, discards outliers, and is meant to represent capacity under reasonable conditions rather than capacity at this exact instant. On this machine it currently sits 152 mAh above the raw value.
Displaying the filtered number is a defensible product decision. A health percentage that visibly moved every time you picked up a cold laptop would generate far more support contacts than it resolved. The cost of that decision is that the displayed figure lags, and lags in the optimistic direction.
The field that everyone quotes wrongly
Search for how to check Mac battery health in Terminal and a large share of the results will tell you to read MaxCapacity. On this machine MaxCapacity reads 100. At 190 cycles, with a genuine capacity loss of roughly 6 to 8 percent depending on which figure you trust, the field reports a flat 100.
On Intel Macs MaxCapacity carried the absolute capacity in milliamp-hours and could be divided by DesignCapacity for a meaningful ratio. On Apple Silicon it is normalised and pinned. Guides that were written against Intel hardware and never re-tested still recommend it, which is a good illustration of why anything published about this deserves a version stamp.
What a 2.43 point gap is worth in practice
Apple’s replacement guidance is built around the displayed percentage crossing 80%, so the displayed number is the one that governs a service conversation. Reading the raw value does not change what a Genius Bar will tell you.
What it changes is how early you can see a trend. If the displayed figure moves in whole percentage points, then between 94% and 93% there is a stretch where nothing on screen changes at all while the pack is still degrading. The raw value moves inside that stretch. Someone tracking a battery across months, rather than glancing at it once, gets a usable signal earlier by logging the raw figure.
The honest caveat is that a single raw reading is close to meaningless. It moves with temperature and with recent charge history. Three readings taken in the same session on this machine varied, which is why the run count on every figure in this article is stated rather than implied. A trend built from one reading a week is informative. A single reading compared against a friend’s single reading is not.
Reproducing this
Everything above comes from two commands and one division. To check your own machine:
# Raw capacities from the battery controller
ioreg -rn AppleSmartBattery | grep -oE '"(DesignCapacity|NominalChargeCapacity|AppleRawMaxCapacity)" = [0-9]+'
# What macOS decides to show you
system_profiler SPPowerDataType | grep -i "maximum capacity"
Divide NominalChargeCapacity by DesignCapacity and round. If the result matches the Settings figure, your machine behaves the way this one does. Divide AppleRawMaxCapacity by the same denominator to see the unrounded, unsmoothed version.
Neither number is the truth about your battery. One is a stable estimate suitable for a settings pane, the other is a noisy instantaneous reading suitable for a trend line. Knowing which one you are looking at is the part that was missing.
Logging the difference over time
A single reading of the raw value is close to meaningless because it moves with temperature and with recent charge history. A monthly log is genuinely useful, because the slope is the thing you actually want to know.
ioreg -rn AppleSmartBattery | awk -v d="$(date +%F)" '
/"DesignCapacity"/ {gsub(/[^0-9]/,""); dc=$0}
/"NominalChargeCapacity"/ {gsub(/[^0-9]/,""); n=$0}
/"AppleRawMaxCapacity"/ {gsub(/[^0-9]/,""); r=$0}
/"CycleCount"/ {gsub(/[^0-9]/,""); c=$0}
/"Temperature"/ {gsub(/[^0-9]/,""); t=$0}
END {printf "%s,%d,%.2f,%.2f,%.1f\n", d, c, n/dc*100, r/dc*100, t/100}
' >> ~/battery-log.csv
Date, cycles, nominal percent, raw percent, temperature in degrees. Logging temperature alongside matters: without it, a reading taken on a cold morning looks like a sudden decline rather than a thermal artefact.
Run it monthly. After six months the raw column shows a trend well before the displayed percentage has moved a single whole number, which is the entire practical value of knowing this distinction exists.
Battery health management and the flat line
If your displayed percentage has not changed in months, the most likely explanation is not a stuck sensor.
macOS runs battery health management, which caps maximum charge when it observes a pattern of sustained AC power. The pack sits near 80 percent instead of 100, which substantially slows chemical ageing, and under that regime capacity loss genuinely does nearly stop.
system_profiler SPPowerDataType | grep -iE "condition|charging|maximum capacity"
The trade is a machine that does not hold a full charge when you unplug and leave, which costs you on a travel day and nothing at all otherwise.
What Apple actually acts on
Two figures govern a service conversation, and neither of them is the raw one.
The displayed percentage crossing 80 is the threshold Apple’s guidance is built around. The
Condition field is the other: anything other than Normal, such as Service Recommended,
outranks both percentages and is worth acting on regardless of what the numbers say.
The raw value is not something to take to a Genius Bar. It is for watching the slope between the whole-number steps of the displayed figure, and for understanding that the number on screen is a deliberately smoothed one rather than a direct reading.
Takeaways
- macOS Settings derives Maximum Capacity from NominalChargeCapacity, not from the raw gauge reading, and rounds the result.
- On this machine that produces 94% on screen against 91.49% from AppleRawMaxCapacity, a gap of 2.43 percentage points.
- The MaxCapacity field in ioreg reads 100 on modern Apple Silicon Macs and is not a health figure at all, despite being widely quoted as one.
- Neither number is wrong. They answer different questions, and only one of them is about how long your laptop will last today.
Questions
- Is macOS lying about my battery health?
- No. It is reporting NominalChargeCapacity, which is the controller's smoothed estimate of usable capacity, and rounding it to a whole number. The raw gauge value is a different measurement taken under different assumptions. Both are real, and the displayed one is the more stable of the two.
- Which number should I actually use to decide on a battery replacement?
- The one in Settings, because it is the figure Apple Support will also look at, and because the raw value moves around between readings. Use the raw value only when you want to see the trend earlier than the rounded percentage will show it.
- Why does ioreg show MaxCapacity = 100?
- On Apple Silicon Macs that field is normalised and reports 100 regardless of the battery's condition. Any guide telling you to read MaxCapacity as a health percentage is quoting a field that stopped meaning that years ago.
Sources
What we read. Distinct from what we measured, which is in the article itself.