我试图找出为什么我为看似相似的循环得到两个不同的输出。我认为这与使用双打和整数循环有关,但我不确定。
此代码输出4:
int num = 10;
int cost;
int counter = 0;
for (cost = 1; cost <= num; cost += 1){
counter += 1;
num -= cost;
}
cout << counter << endl;
这是此部分的输出:
Current Cost: 1
Remaining: 9
Current Cost: 2
Remaining: 7
Current Cost: 3
Remaining: 4
Current Cost: 4
Remaining: 0
4 candies; 0 left over
此代码输出3:
double num = 1.0;
double cost;
int counter = 0;
for(cost = 0.1; cost <= num; cost += .1) {
counter +=1;
num -= cost;
}
cout << counter << endl;
编辑:
这是我尝试调试时此代码的输出:
Current Cost: 0.1
Remaining: 0.9
Current Cost: 0.2
Remaining: 0.7
Current Cost: 0.3
Remaining: 0.4
3 candies; 0.400000 left over
为什么两者之间存在差异?
答案 0 :(得分:2)
我可能不应该这样做,但我调试了你的代码,并且在第4次迭代中双循环失败:
费用和 num 都采用 0.4 的值,但是:
cost <= num;
评估为false; 这是因为双精度的存储性质非常精确。 我建议在处理双打时避免使用==,&gt; =和&lt; =语句。 解决方案是将您的循环转换为:
for(cost = 0.1; cost < num+0.001; cost += .1) {
counter +=1;
num -= cost;
}
因此解决了精度问题,但我建议反对,因为它可能会在更复杂的环境中导致问题。