为什么100 * 4.2以419而不是420出现?

时间:2016-12-07 12:40:44

标签: c cs50

当输入4.2时,我的代码中无法找出错误,因为更改将是420,而是现在是419.我的代码出了什么问题?

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

int evaluate(int change){

    int quarter,dime,nickel,penny;
    int coins = 0;

    quarter = change/25;
    change = change%25;
    printf("quarters:%d\n" ,quarter);
    printf("change left: %d\n",change);
    dime = change/10;
    change = change%10;

    printf("dimes:%d\n" ,dime);
    printf("change left: %d\n",change);
    nickel = change/5;
    change = change%5;

    printf("nickels:%d\n" ,nickel);
    printf("change left: %d\n",change);
    penny = change;
    coins = quarter+dime+nickel+penny;

    printf("pennies:%d\n" ,penny);
    printf("change left: %d\n",change);
    return coins;
}


int main()
{
    printf("How much:");
    float input = GetFloat();
    int coin = 0;

    while(true)
    {
        if(input>0)
        {
            int change = (100*input);
                printf("change: %d\n",change);

            coin = evaluate(change);

            printf("%d\n",coin);
            return 0;
        }    

        else
        {
            printf("are you serious? retry:");
            input = GetFloat();
    }    }
}

该计划旨在评估出纳员必须向客户提供的最少数量的硬币。问题是,在输入4.2时,输出出错了;另外change=100*input的输入为419,输入为4.2。请帮我弄清楚问题。

Code on left side and output on right.

1 个答案:

答案 0 :(得分:2)

使用您平台上使用的二进制浮点格式无法准确表达

4.2。当您将其乘以100时,它会给出一个略小于420的数字。将其转换为整数会产生419

您可以通过使用以下内容对转化前的数字进行四舍五入来防止这种情况:

int n = round(number);

或者通过添加舍入调整:

int n = (int)(number + 0.5);

请勿使用float进行此计算,请使用正确舍入的分数,如此答案所述:Integer overflow in greedy coin counting