Computers deal in absolutes; they cannot at the bit level explicitly represent a fraction. This is worked around using floating-point representation, which is a method of representing an approximation to a real number.
Unfortunately, some numbers are just impossible to represent 100% accurately and this leads to imprecision when dealing with floating-point arithmetic.
For more information on precisely why this is the case, do some research into floating-point representation. But it's quite a mathematically technical subject.
EDIT
Let me clarify this. We all know that computers deal in binary. They read, write and process bits which are either 1 or 0.
A 32-bit processor will typically divide memory into 4-byte chunks. So the default size for ints and floats are 4 bytes, or 32 bits. Representing a whole number (an int) in binary is easy. The number 8 is: 00000000 00000000 00000000 00001000. But how does a computer represent a decimal number? Remember that it can only see 1s and 0s; it cannot just place a "." in the middle of them!
Fixed-point representation (e.g., saying the first 16 bits is the integral value (the part before the .), the second 16 bits is the fractional value) significantly limits the range of numbers that can be represented, since it reduces the maximum number to a 16-bit int and potentially wastes all the bits after the "." which may not be needed.
So computers use a technique called floating-point representation, where the number is scaled using an encoded exponent. So part of the number is the exponent and part is the fraction. This massively increases the range of possible numbers compared to fixed-point notation. But some numbers just cannot be represented to complete precision.
This is why any computer system dealing with currencies never stores values as floats (e.g., £1.10 will always be stored as 110p). Any system where precision is essential should perform as much arithmetic as ints and do any division into floats as the last step.
Note that this is not just a PHP issue, it exists in all languages. E.g., JavaScript:
alert((0.1+0.7)*10); // alerts 7.9999999999