我的简短C代码中的小错误.为什么?

Dav*_*mig 1 c floating-point cs50

我无法弄清楚为什么这对90%的输入起作用,而不是其他输入.这是为了告诉你在变化中会得到多少硬币.大多数测试数量都可以正常工作,但是如果输入4.20(或4.20美元),它将返回23个硬币......应该是18个硬币(16个季度和2个镍币).这个bug在哪里?这是我的代码:

#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;
    }
Run Code Online (Sandbox Code Playgroud)

Dan*_*her 6

最接近的float4.20略小于(4.19999980926513671875,对于通常的32位IEEE754 float).因此,在你减去16个季度的4美元后,你剩下的数量略小于0.2.将其除以0.1会得到略小于2的nickels值,因此您的值为1.当您减去镍后,该值稍微小于0.1,除以0.05会导致略小于2的商.

您应该仅使用整数进行此类计算,以美分计算.