Floating-point data types such as float and double are not infinitely precise.
That means that in a float you cannot just store any number between the min. and max. possible values with any arbitrary number of decimal digits.
The precision of a float is about 6 or 7 decimal digits, so if you try to store numbers with more digits (such as 666666.77 which is 8 digits) then you'll see rounding errors.
In addition to that float and double store numbers as binary fractions instead of decimal fractions. Not all values that in the decimal number system can be represented by a finite number of digits can be stored exactly in the binary system (for example the value 0.1). See Ulf's link for details. [ March 13, 2007: Message edited by: Jesper Young ]