意外的DO-WHILE行为:它是否忽略了表达式

Unexpected DO-WHILE behavior: Is it ignoring the expression?

本文关键字:表达式 是否 DO-WHILE 行为 意外      更新时间:2023-10-16

我有一些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);
}

这适用于除0.05美分以外的所有硬币。即使(totalTendered < amountToPay)的值相等,它也会要求额外的硬币。有谁能告诉我我的问题可能是什么?

注意:这些对象是从它们各自的vector容器中引用的。请随意请求任何您可能认为相关的附加代码。

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

更详细地说,问题是值0.05不能精确地用二进制浮点表示。它可能真的是0.0499999999999,这并不是你想要的。当你将其与你的目标值进行比较时,比较结果是"是的,那更少",甚至认为它可能只少0.0000000000001美分。