Particles are not in contact with object
It seems it is the child particles which are being placed above or below the surface. I found that changing the 'Children' type on the particle system from 'Simple' to 'Interpolated' created a more accurate result, though I'm not quite sure why 'Simple' children wouldn't respect the location as much: