Some decimal numbers can only be represented with a certain precision on a system. In the case of normal floating point numbers that precision depends on the format of the number (usually IEEE 754). Hardware differences and base constraints can introduce small rounding errors.
There are also other factors which might come into play: when dealing with software floating point calculations you might get irrational numbers or numbers too small to deal with full-precision calculations (i.e. subnormals or denormals). Some compilers treat them as allowed while others flush the result to zero. And some systems also use the so-called fast-math calculation which allows faster results by using hardware circuitry which works with less precision.
All these behaviors force you to put an epsilon, a "tolerance" threshold that covers you by the approximation errors.
If you're dealing with floating point calculations I strongly recommend reading http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html