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

Simple function does not always return expected output

本文关键字:输出 返回 函数 简单      更新时间:2023-10-16

我有一个程序,用户在其中输入到期金额和支付金额。函数makeChange(双倍金额(传递差额(已付 - 到期(并返回一个双精度数组,其中到期的更改按面额细分。

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 便士。

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

我认为您发布的代码没有任何问题。 问题可能出在你正在解释的这个函数的调用方身上 更改数组中的值。 如果您也可以在此处发布,那将更有帮助。

干杯。

首先,在 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;
}