Erik Wiffin resume perfectamente en esta página web con el curioso nombre de 0.30000000000000004.com uno de los problemas de la representación matemática de los números en coma flotante que utilizan las computadoras, o más bien los lenguajes que se usan en las computadoras.
Todos los números se almacenan con una cantidad limitada de dígitos. A veces, al cambiar de una base a otra (por ejemplo de base 10 a base 2, binario), se pierde parte de esa información y al operar con ella se amplifica el problema creando un poco de confusión. En el ejemplo que produce el curioso nombre de la página, al convertir 0,1 y 0,2 a binario la secuencia de dígitos binarios es repetitiva (aunque ambos son «números redondos» en base 10). El resultado es que en muchos lenguajes al calcular luego 0,1 + 0,2 con esos dígitos y volver a convertirlo a decimal el resultado no es exactamente 0,3 como debería de esperarse.
El porque
De hecho, es bastante interesante. Cuando tienes un sistema de base 10 (como el nuestro), solo se puede expresar fracciones que usan un factor primo en la base. Los factores primos de 10 son 2 y 5. Así que 1/2, 1/4, 1/5, 1/8 y 1/10 pueden expresarse claramente porque todos los denominadores usan factores primos de 10. En contraste, 1/3, 1/6, 1/7 y 1/9 son decimales periódicos porque sus denominadores usan un factor primo de 3 o 7.
En binario (o base 2), el único factor primo es 2, por lo que solo puede expresar claramente fracciones cuyo denominador tenga solo 2 como factor primo. En binario, 1/2, 1/4, 1/8 se expresarían claramente como decimales, mientras que 1/5 o 1/10 serían decimales repetidos. Entonces 0.1 y 0.2 (1/10 y 1/5), mientras que los decimales limpios en un sistema de base 10, son decimales repetidos en el sistema de base 2 que usa la computadora. Cuando realiza matemáticas en estos decimales repetidos, termina con sobras que se transfieren cuando convierte el número de base 2 (binario) de la computadora en una representación de base 10 más legible por humanos.
Algunos ejemplos

La página muestra lo que aparece como resultado al usar diversos lenguajes: Ada, C, C++, C#, Common Lisp, Erlang, Fortran, Go, Roku, Java, MathLab, Mathematica, PHP, Perl, Python, R, TCL, Visual Basic y otros más esotéricos. En cada uno de ellos se calcula la suma (0,1+0,2) y se muestra el resultado (0,3; 0,30000000000000004; 0,300000; 0.300000012; 0.2999999999999999888977697537… hay de todo). A veces se indican comentarios y trucos sobre cómo obtener los dígitos, formateando el resultado o definiendo la precisión en la configuración.
Hay más detalles sobre todo esto en el IEEE 754-2008 que es el estándar para aritmética en coma flotante y en What Every Computer Scientist Should Know About Floating-Point Arithmetic, un estupendo artículo al respecto.