I'm sorry... I didn't see Bruce's question until just now.

The answer is: "Don't worry about it." The root of the problem is the different GCode commands use different methods to probe the bed. That is slowly getting unified. But because they use different methods, they report some what different values. G28 does its thing using linear move routines. G29 uses the probe_pt() routine and then corrects for Z_PROBE_OFFSET_FROM_EXTRUDER. And M48 is sort of a hybrid of the two.

This is getting corrected, but right now getting the Release Candidate stable and out the door is a higher priority.

If you use G29, don't worry about the G28 numbers. G29 is correcting for the bigger picture. G28 is mostly concerned about making sure the nozzle is within the build space.

And M48 doesn't care about any of that. It just cares that it can accurately measure the location of the probe again and again. It subtracts off what ever the mean of the measured points is and calculates the standard deviation.