It's a standard problem due to how the computer stores floating point values. Search here for "floating point problem" and you'll find tons of information.
In short - a float/double can't store 0.1 precisely. It will always be a little off.
You can try using the decimal
type which stores numbers in decimal notation. Thus 0.1 will be representable precisely.
You wanted to know the reason:
Float/double are stored as binary fractions, not decimal fractions. To illustrate:
12.34 in decimal notation (what we use) means 1*101+2*100+3*10-1+4*10-2. The computer stores floating point numbers in the same way, except it uses base 2: 10.01 means 1*21+0*20+0*2-1+1*2-2
Now, you probably know that there are some numbers that cannot be represented fully with our decimal notation. For example, 1/3 in decimal notation is 0.3333333... The same thing happens in binary notation, except that the numbers that cannot be represented precisely are different. Among them is the number 1/10. In binary notation that is 0.000110011001100...
Since the binary notation cannot store it precisely, it is stored in a rounded-off way. Hence your problem.