I can think of 2 ways to do this, both are quite mathmatically simple.
First option is to add a random number to your target value.
target + (random(1) - 0.5) * (100 - precision)
For the above it assumes precision is in the range 0 to 100, and gives an output between target ± 100 and target ± 0. If you want 100% precision to not match exactly then you can do
target + (random(1) - 0.5) * (100 - precision * 0.95)
target ± 100 to target ± 5
If you want a larger range
target + (random(1) - 0.5) * (100 - precision) * 4
target ± 400 to target ± 0
Second option is to generate a random number and do a linear interpolation towards your target value.
lerp(random(100), X, precision * 0.01)
target ± 100 to target ± 0
If you want to change the range then just modify the number given to random, if you want 100% to not be exact try
lerp(random(100), X, precision * 0.0095)
target ± 100 to target ± 5
One thing you can do with this one is change the probably curve, by performing a power on the precision value like so
lerp(random(100), X, (precision * 0.0095) ^ 2)