我有一些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/