为什么我的 for 循环永远不会结束?

Why does my for loop never end?

所以,我有这段代码应该将要测试的每个范围添加到 'freqDistRanges' 向量中。 'values' 是一个双精度类型的向量,用于保存用户输入。我的问题是,如果我在 'values' 数组中输入的值少于十个,则 for 循环永远不会结束。我不明白为什么会这样,例如,如果只输入一个值,freqDistRange 将等于 0.1。当 i > 0.1 时 for 循环将停止,并且 i 在第二次迭代中等于 0.1,在第二次迭代中等于 0.2,这应该结束 for 循环。我在这里错过了什么,我觉得这是我忽略的简单事情。感谢您的帮助。

double freqDistRange = ((double)values.size() / 10); // there will be ten ranges

// add each range to the 'ranges' vector
for (auto i = 0; i <= ((double)values.size() * freqDistRange); i +=     freqDistRange)
        freqDistRanges.push_back(i);

i 是一个 int,这里只能保存整数值。如果 i0,并且您向它添加 0.1,它仍然是 0。如果你将 0.1 添加到它一百万次,它将 仍然0.

你应该改变:

auto i = 0;

至:

double i = 0;

或:

auto i = 0.0;

如果您必须确保选择所需类型的初始值,那么在这种特殊情况下使用 auto 没有任何好处。如果你知道你需要类型 double,你还不如将它显式声明为 double.

问题是您打算将 double 作为循环计数器,但是 auto i = 0; 根据 0 推导出类型,即 int。这是在 for 循环中使用 auto 时需要注意的一个陷阱。 See here 关于该主题的另一个 SO 问题。

但是,如果您想要恰好有 11 个步骤,那么使用 double 作为变量类型 不是 一个好主意。这是因为浮点运算本质上并不十分精确,因此由于舍入误差,您可能会得到 10 或 12 步。

要获得精确的行为,请使用整数类型作为循环计数器。这里:

double freqDistRange = values.size() / 10.0;

for (int i = 0; i <= 10; ++i)
{
    freqDistRanges.push_back( i * freqDistRange );
}