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

Ale*_*der 1 c++

我有一些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);
}
Run Code Online (Sandbox Code Playgroud)

这适用于所有硬币,但0.05美分.即使在(totalTendered < amountToPay)评估相等的值时,它也会要求额外的硬币.任何可以解释我的问题可能是什么的人?

注意:正在从各自的vector容器中引用对象.您可以随意申请任何您认为相关的其他代码.

Gre*_*ill 5

你有点浮点舍入错误.使用a int来跟踪分数,而不是使用a double来跟踪美元.

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