Porque un campo FLOAT, como el DOUBLE o REAL es un campo de
punto flotante, y un número de punto flotante, por definición, guarda números
por aproximación.
Tan simple como eso.
Conforme lo explica el manual de referencia ():
Cita: El tipo FLOAT se usa para representar tipos numéricos aproximados.
y también:
Cita: FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
Un número de coma flotante pequeño (de precisión simple). Los valores permitidos son de -3.402823466E+38 a -1.175494351E-38, 0, y de 1.175494351E-38 a 3.402823466E+38. Si se especifica UNSIGNED, los valores negativos no se permiten. M es la anchura de muestra y D es el número de dígitos significativos. FLOAT sin argumentos o FLOAT(p) (donde p está en el rango de 0 a 24) es un número de coma flotante con precisión simple.
En tu caso el problema es que
estás tratando de guardar un entero en un float, lo que no tiene sentido.