Convertir flotante al doble pierde precisión pero no a través de ToString

Tengo el siguiente código

float f = 0.3f;
double d1 = System.Convert.ToDouble(f);
double d2 = System.Convert.ToDouble(f.ToString());

Los resultados son equivalentes a:

d1 = 0.30000001192092896;
d2 = 0.3;

Tengo curiosidad por saber por qué esto es así.

Respuestas a la pregunta(3)

Su respuesta a la pregunta