意外的DO-WHILE行为:它是否忽略了表达式
Unexpected DO-WHILE behavior: Is it ignoring the expression?
我有一些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美分。
相关文章:
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- 在 C 和 C++ 中,使用逗号运算符的表达式是否未定义"a = b, ++a;"?
- 布尔表达式是否像使用 if 或 switch 进行分支一样繁琐?
- ranged-for 语句中的表达式是否在每次迭代时计算
- 正则表达式是否足以分析大型文本
- 使用堆栈来确定表达式是否具有平衡圆括号
- 如何正确测试我的后缀表达式是否有效
- C++11 正则表达式是否适用于 UTF-8 字符串
- 新表达式是否会返回指向数组的指针
- 检查一个正则表达式是否涵盖另一个正则表达式
- 动态分配正确对齐的内存:char数组上的新表达式是否合适
- 元正则表达式:测试正则表达式是否只是一个字符串(没有正则表达式"wildcards")
- 检查编译的表达式是否包含所有隐式转换
- 具有未定义行为但从未实际执行的表达式是否会使程序出错
- 频繁执行的表达式是否会缓存其结果
- boost::lambda::bind 表达式是否阻止内联/是否有另一种形式不会?
- 检查表达式是否编译的可移植方法
- lambda 函数/表达式是否支持 constexpr