我有一些C++作业,但被一些意外行为所卡住。以下代码是所讨论程序的一部分:

void tenderMoney(Candy& _Candy, CoinCount& _Coins){

const double amountToPay = _Candy._Price;
int coinTendered = 0;
double totalTendered = 0;

do {
    cout << "Insert a coin: ";

    if (cin >> coinTendered){

        switch (coinTendered){
        case 5: {
            totalTendered += 0.05;
            _Coins._Nickels++;
            break;
        }
        case 10: {
            totalTendered += 0.10;
            _Coins._Dimes++;
            break;
        }
        case 25: {
            totalTendered += 0.25;
            _Coins._Quarters++;
            break;
        }
        default:
            break;
        }
    }
    else {
        cout << "Invalid coin. ";
        cin.clear();
        cin.ignore();
    }
  } while (totalTendered < amountToPay);
}

该功能适用​​于除.05美分以外的所有硬币。即使(totalTendered < amountToPay)评估为相等的值,它也会要求额外的硬币。任何人都可以弄清楚我的问题可能是什么?

注意:对象是从各自的vector容器中引用的。随意请求您可能认为相关的任何其他代码。

最佳答案

您被浮点数舍入错误所困扰。使用int跟踪美分,而不是使用double跟踪美元。

更具体地说,问题是值0.05不能精确地用二进制浮点表示。可能确实是0.0499999999999,这并不是您想要的。当您将其与目标值进行比较时,即使认为可能仅少0.0000000000001美分,比较结果仍是“是,即更少”。

关于c++ - 意外的DO-WHILE行为:是否忽略表达式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26223795/

10-12 16:18