This falls into the category of things every programmer should know about floating point. The way that floating point works means that some numbers are not fully representable in floating point. The simplest way to explain this is to ask you to write down the value 1/3 as a decimal number. You start out quite happily, but eventually you end up running out of paper. The reason for this is that in base ten notation, the number 1/3 is infinitely long and so in a sensible encoding system which uses base ten notation to store the number, there is a limit to how long it can be.
Floating point does the same thing, but uses base 2. This means that numbers which seem really simple to us, e.g. 1/10 or 0.1, become infinitely recursive. This causes a roundoff error when you come to print the numbers, simply because the number you stored is not the number you gave to the compiler because it wasn't possible to store the number.
The canonical paper on this is http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html, which is a hefty read, but explains all of this and a lot more.