(a) The correct amount of rounding depends on your problem domain. E.g. you might decide that lines within 1° of each other should be considered parallel.
(b) The floating-point representation puts a lower bound on the necessary rounding. Determining error propagation is a large subject in the field of numerical analysis.
All finite floating point numbers have a predecessor and successor number. This “step size” between numbers or “machine epsilon” depends on the magnitude of the number, i.e. is smallest around zero and grows towards positive and negative infinity. But conveniently, this is a constant relative error. For a 64-bit double there are 53 significant bits, leading to a relative step size of around 2^-52 = 2.22E-16 (the machine epsilon is usually defined as half that).
Assuming that your input values are as exact as possible (i.e. their relative error is the machine epsilon) you can trace your calculations to see how these errors propagate. E.g. for an addition or subtraction, you must add the absolute errors. Note that e.g. subtracting two similar values might result in a value that is on the order of its absolute error (catastrophic cancellation). It is sometimes possible to re-arrange calculations to avoid this. For a multiplication or division, you can add the relative errors.
You can use the results of your analysis to calculate suitable absolute and relative bounds at runtime.
As a super simple example, consider a test for equality of two floating point numbers a and b, under the assumption that their error is the machine epsilon. One simple approach would be to compare the next and previous float, i.e.
prev(a) <= b && b <= next(a). If the two numbers have arbitrary errors this is more difficult but the idea is the same: derive absolute error bounds and compare if the bounded area overlaps. This can be done conveniently by comparing their difference, i.e.
abs(a - b) <= absolute_error.
For a thorough treatment of floating point comparisons, read https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/. That page also discusses when it's more appropriate to count ULPs (number of discrete floats between two numbers) than to deal with machine epsilons.