为什么我的最小硬币计算器在输入 0.41 和 4.2 时返回不正确的结果?

Why is my minimum-coin calculator returning incorrect results for inputs of 0.41 and 4.2?

我正在处理 CS50x 的 pset1 的现金问题。该程序应该在给定浮点数输入的情况下打印找零所需的最少硬币数 (US)。我很难弄清楚我的代码有什么问题。程序 returns 正确输出某些值,如 23、0.01 和 0.15,但 returns 不正确的值,特别是 0.41 和 4.2,分别返回 3 和 22 而不是 4 和 18。我'我已经多次检查这段代码,但我找不到任何东西。我唯一的想法是浮点数可能会变圆或被截断,但我真的不知道。

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

float total_coins = 0;

float get_coin_amount(float amount, float coin_value);

int main(void)
{
    float change = get_float("Change owed: ");
    get_coin_amount(get_coin_amount(get_coin_amount(get_coin_amount(change, 0.25), 0.1), 0.05), 0.01);
    printf("%f\n", total_coins);
}

float get_coin_amount(float amount, float coin_value)
{
    float revised_amount = amount; //revised amount will be used to give a working total of the amount left
    while (revised_amount >= coin_value) //continue until the coin value can no longer go into the remaining amount
    {
        total_coins++; //update coins counter
        revised_amount = revised_amount - coin_value;//updates revised_amount
    }
    return revised_amount; //return remainder left after the coin goes into it as many times as possible
}

我认为你应该使用整数而不是浮点数。

即,将 change 乘以 100 并转换为 int。使用 25、10、5、1 作为硬币值。否则看起来很结实。

编辑:您的解决方案有缺陷。它实际上在任何时候都不 return 正确的硬币数量。似乎只适用于单个硬币的倍数。

应该看起来更像这样:

float get_coin_amount(float amount, float coin_value)
{
    float revised_amount = amount; //revised amount will be used to give a working total of the amount left
    while (revised_amount >= coin_value) //continue until the coin value can no longer go into the remaining amount
    {
        total_coins++; //update coins counter
        revised_amount = revised_amount - coin_value;//updates revised_amount
    }
    if (revised_amount > 0) {
        if (coin_value == 25) {
            return total_coins + get_coin_amount(revised_amount, 10);
        } else if (coin_value == 10) {
            return total_coins + get_coin_amount(revised_amount, 5);
        } else {
            return total_coins + get_coin_amount(revised_amount, 1);
        }
    } else {
        return total_coins;
    }
}

然后像这样调用方法:

amount = (int) (get_float(...) * 100);
num_coins = get_coin_amount(amount, 25);