循环使用double vs int

时间:2017-04-18 01:04:45

标签: c++ loops integer double

我试图找出为什么我为看似相似的循环得到两个不同的输出。我认为这与使用双打和整数循环有关,但我不确定。

此代码输出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

为什么两者之间存在差异?

1 个答案:

答案 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;
}

因此解决了精度问题,但我建议反对,因为它可能会在更复杂的环境中导致问题。