所以,我有这个代码,应该将每个要测试的范围添加到'freqDistRanges'向量中。 'values'是double类型的向量,用于保存用户输入。我的问题是,如果我在'values'数组中输入少于10个值,for循环永远不会结束。我不明白为什么会这样,例如,如果只输入一个值,则freqDistRange将等于0.1。当我>时,for循环将停止0.1和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);
答案 0 :(得分:4)
i
此处为int
,只能保存整数值。如果i
为0
,并且您向其添加了0.1
,那么它仍然是0
。如果您将0.1
添加到其中一百万次,则 仍 0
。
你应该改变:
auto i = 0;
要么:
double i = 0;
或:
auto i = 0.0;
如果您必须确保选择所需类型的初始值,则在此特定情况下使用auto
没有任何好处。如果您知道自己需要输入double
类型,则可以明确地将其声明为double
。
答案 1 :(得分:1)
问题在于您打算将double
作为循环计数器,但auto i = 0;
根据0
推导出类型为int
的{{1}}。在auto
循环中使用for
时,这是一个需要注意的陷阱。 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 );
}