浮点的C现金分区错误



im当前在CS50"现金"问题上工作:估计支付一些更改所需的硬币数量。

ex:$ 0.41欠= 1季度,1毛钱,1镍,1便士。

但是,当估计所需的硬币量时,我最终会偏离我认为是错误的便士,因为它似乎总是被一个或2个硬币(便士(掉下来。

我包含了多个printf语句,以尝试跟踪我可以做的事情,但我似乎无法弄清楚为什么该部门不起作用。

#include <cs50.h>
#include <stdio.h>
int main(void)
{
    // change
    float change = get_float("how much change is owed?: ");
    int coins = 0;
    //reprompt
    while (change < 0)
    {
        change = get_float("how much change is owed?: ");
    }
    //quarter
    float quarter = 0.25;
    float quarters = change / quarter;
    quarters = (int) quarters;
    change = change - (quarters * quarter);
    printf("%f quartersn", quarters);
    //dimes
    float dime = 0.10;
    float dimes = change / dime;
    dimes = (int) dimes;
    change = change - (dimes * dime);
    printf("%f dimesn", dimes);
    //nickels
    float nickel = 0.05;
    float nickels = change / nickel;
    nickels = (int) nickels;
    change = change - (nickels * nickel);
    printf("%f nickelsn", nickels);
    printf("%f in change left changen", change);
    //pennies
    float penny = 0.010000;
    float pennies = change / penny;
    pennies = (int) pennies;
    change = change - (pennies * penny);
    printf("%f penniesn", pennies);
    //coins
    coins = quarters + dimes + nickels + pennies;
    printf("%in", coins);
    //printf("%fn", change);
}

在您的C实现中,这些行:

float dime = 0.10;
float nickel = 0.05;
float penny = 0.010000;

dime设置为0.100000001490116119384765625,nickel至0.0500000000000000000007450580596923828125和penny至0.009999999999999999776482582582092228515625。这导致计算每枚硬币略有关闭。此外,处理每个硬币后change的计算都有舍入错误。

要解决此问题,在使用get_float获得change后,将其转换为以下几美分:

int cents = roundf(change * 100);

然后用整数算术执行所有计算。(包括<math.h>以获取roundf的声明。(

从此行开始:

#include <math.h>

#define PENNIES_IN_GBP (100)

int main(void)
{
        int change_pn = roundf(PENNIES_IN_GBP * get_float("how much change is owed?: "));
        /* ... */
        return 0;
}

其余的应该很容易;(

只是一个建议,为什么不执行整数算术中的所有计算?将浮点"更改"转换为整数"美分"

(int) cents = roundf(100.0 * change); // see comments below answer

然后将所有内容保留为整数之后,例如

//quarter
const int quarter = 25;
int quarter_count = cents / quarter;
cents = cents % quarter; // use modulus operator

我也可能会恭敬地建议,使用非常相似的变量名称,例如季度和四分之一,可能会导致错误。

您永远不想更改一个季度(尤其是偶然地(中的美分数,您可以将其声明为const int。

您可能还想检查用户是否输入了他们认为是美元而不是整数的美分数量的十进制(浮动(金额。但这超出了这个问题的范围。

最新更新