A question that is coming up more frequently on the Zwift Riders Facebook group is "Why is Zwift not showing the same speed as my Garmin?"
The answer is simply that Zwift is calculating your speed based on the environmental factors built into the Zwift 3-D courses. These include hills, flat sections, turns and other factors in the virtual courses that Zwift provides which your Garmin can't possibly know anything about.
To the Garmin (or any other bike computer you may be using), your bike is traveling on a 0% grade, flat road for your entire ride. It's not seeing the hills, descents or flats because those are virtualized within Zwift only.
The speed, cadence and distance that Garmin sees are calculated by a sensor traveling around and around on your wheel, turning a certain number of revolutions per-minute and your performance calculated based on that. The Garmin head unit reads those, does the math and figures out how "fast" you're traveling, just as if you were riding on the real road at that speed.
But Zwift, "virtualizes" your speed, distance, incline and power based on the data your sensors are sending to it and applies that to the virtual terrain on the course (currently Watopia or the Richmond UCI Course).
The two calculations (Garmin vs. Zwift) will never be 100% identical because they're not looking at the same "road" you're riding your bike on while it's locked in a stationary trainer.
Hope that helps!