简单函数并不总是返回预期的输出

时间:2018-09-29 03:42:25

标签: c++

我有一个程序,用户在其中输入应付款和已付款。函数 makeChange(double amount)传递差额(已付款-到期),并返回一个double数组,其中到期的找零按面额细分。

double* makeChange(double amount) {
    double* change = new double[10];
    double values[10] = { 100, 50, 20, 10, 5, 1, .25, .10, .05, .01 };

    double remaining = amount;

    for (int i = 0; i < 10; i++) {
        change[i] = floor(remaining / values[i]);
        remaining -= (change[i] * values[i]);
    }

    return change;
}

我并不总是能获得预期的输出。例如,当我通过(0.05-0.00)作为金额时,它返回说我需要1个镍。但是,如果我通过(4.05-4.00)作为金额,它将返回说我需要4便士。

代码中的什么导致这种情况发生? 谢谢!

2 个答案:

答案 0 :(得分:0)

我认为您发布的代码没有任何问题。 该函数的调用者可能在您正在解释的地方出现问题 更改数组中的值。 如果您也可以在此处发布该信息,将会更有帮助。

干杯。

答案 1 :(得分:0)

首先,在c ++中,不需要使用指针来创建数组,可以使用std::array。 您可以替换功能,使其更安全:

array<double, 10> makeChange(double amount) {
    cout << "Amount: " << amount << endl;
    array<double, 10> change = {};
    double values[10] = { 100, 50, 20, 10, 5, 1, .25, .10, .05, .01 };

    double remaining = amount;

    for (int i = 0; i < change.size(); i++) {
        change[i] = floor(remaining / values[i]);
        remaining -= (change[i] * values[i]);
    }

    return change;
}


int main() {
    array<double, 10> change;

    change = makeChange(4.05f - 4.0f);
    for (size_t i = 0; i < change.size(); i++) {
        cout << change[i] << endl;
    }

    return 0;
}

对于更改的问题-将浮点值传递给函数时,请使用f传递它们,如下所示:

change = makeChange(4.05f - 4.0f);

这将使您的计算变得不那么意外,因为您正在使用点后的数字较少的数字(使用float而不是double)。甚至更简单的解决方案,将所有双打替换为浮点数(在概念上无效,但可以解决此问题):

array<float, 10> makeChange(float amount) {
    cout << "Amount: " << amount << endl;
    array<float, 10> change = {};
    float values[10] = { 100, 50, 20, 10, 5, 1, .25, .10, .05, .01 };

    float remaining = amount;

    for (int i = 0; i < change.size(); i++) {
        change[i] = floor(remaining / values[i]);
        remaining -= (change[i] * values[i]);
    }

    return change;
}


int main() {
    array<float, 10> change = makeChange(4.05 - 4.0);
    for (size_t i = 0; i < change.size(); i++) {
        cout << change[i] << endl;
    }
    return 0;
}