Pequeño error en mi código C corto. ¿Por qué?

No puedo entender por qué esto funciona para el 90% de los insumos, pero no para los demás. Está destinado a decirle cuántas monedas volvería a cambiar. La mayoría de los montos de prueba funcionan bien, pero si ingresas 4.20 (o $ 4.20), devuelve 23 monedas ... deben ser 18 monedas (16 trimestres y 2 centavos). ¿Dónde está el error? Aquí está mi código:

#include <stdio.h>
#include <cs50.h>

int main(void){

    float change = 0.00;

    printf("How much change is owed? ");
    change = GetFloat();

    float quarters = change/.25;
    change-= (int)quarters*.25;

    float dimes = change/.10;
    change-= (int)dimes*.10;

    float nickels = change/.05;
    change-= (int)nickels*.05;

    float pennies = (change+.005)/.01;
    change-=(int)pennies*.01;

    int total = (int)quarters+(int)dimes+(int)nickels+(int)pennies;

    printf("%d\n", total);

    return 0;
    }

Respuestas a la pregunta(3)

Su respuesta a la pregunta