You can derive detailed part geometry using the LDraw parts library. LDraw provides freely accessibly models for nearly every part that Lego has produced. I'd recommend parsing these parts rather than rolling you own models if you're going to be using many parts.
Here is the relevant content of the file representing a 1 x 1 round plate:
1 16 0 3 0 -1 0 0 0 -1.25 0 0 0 1 stud4.dat
1 16 0 3 0 -6 0 0 0 -1 0 0 0 6 4-4disc.dat
1 16 0 3 0 -2 0 0 0 -1 0 0 0 2 4-4ring4.dat
1 16 0 0 0 10 0 0 0 3 0 0 0 10 4-4cylo.dat
1 16 0 0 0 2 0 0 0 1 0 0 0 2 4-4ring4.dat
1 16 0 0 0 2 0 0 0 1 0 0 0 2 4-4ring3.dat
1 16 0 0 0 1 0 0 0 1 0 0 0 1 stud.dat
LDraw uses its own custom file format. Units are in LDU and represent about .4mm.
I won't try to describe the format in detail, but lines starting with 1
simply include another file that is translated, scaled, and rotated based on the included transformation matrix.
Base cylinder
We can break the part definition down to its components. The outside of the base cylinder corresponds to:
1 16 0 3 0 -1 0 0 0 -1.25 0 0 0 1 stud4.dat
stud4.dat represents a ring that could fit a stud inside of it. It's present in many parts (e.g. underneath 2xn bricks and plates). It looks like this:

Its outside is represented as (from stud4.dat):
1 16 0 -4 0 8 0 0 0 4 0 0 0 8 4-4cyli.dat
The primitive 4-4clyi.dat (4 fourths of a cylinder) is a basic open cylinder:

Most LDraw primitives including this one are normalized size 1, so we start with a cylinder with height 1 and radius 1. A transformation matrix is then applied:
1 16 0 -4 0 8 0 0 0 4 0 0 0 8 4-4cyli.dat
| |
+-------+-------+
|
8 0 0
0 4 0
0 0 8
Now, it's a cylinder of height 4 and radius 8. This was also transformed by the original inclusion of stud4.dat:
1 16 0 3 0 -1 0 0 0 -1.25 0 0 0 1 stud4.dat
We need to multiply its height by 1.25 to get a cylinder of height 5 and radius 8. Here's the final result:
Base height = 1 * 4 * 1.25 = 5 LDU * .4mm = 2.0mm
Base diameter = 2 * 8 LDU = 16 LDU * .4mm = 6.4mm
Middle ring
If you followed all of that, the middle ring is easy. It's outer wall is represented by:
1 16 0 0 0 10 0 0 0 3 0 0 0 10 4-4cylo.dat
So, it's a cylinder with a 10 LDU radius and 3 LDU height:
Middle ring diameter = 2 * 10 LDU * .4mm = 8mm
Middle ring height = 3 LDU * .4mm = 1.2mm
Checking our work
The height of the base and the middle ring sum to 8 LDU, which is good because this is the correct height for a plate like this.
As you noted, you expected the outer ring to be 7.8mm, but I calculated it as 8.0mm. The reason for this is that LDraw uses the ideal sizes of bricks for its library. This is convenient for collision boxes in the theoretical world, but in reality, Lego has to make parts slightly smaller so that they fit between each other easily. As you mentioned, this tolerance is about .1mm per side, so we're in the right neighborhood with our calculations.
In addition, most things in LDraw end up rounded to 1 LDU, so measurements have a tolerance of around +/- .2mm. Most Lego parts fit very nicely into a 1 LDU grid, so this isn't usually an issue. I'm not sure what level of precision you require, but my hunch is that the LDraw library will get you close enough for your needs.
Good luck with your project, and let us know if we can help with anything else!