【问题标题】:For loop doesn't increment the counter 'i'For循环不会增加计数器'i'
【发布时间】:2012-11-26 09:28:04
【问题描述】:
double n = 1.3243;
for (int i = 0; long(n*10) % 10 != 0; i++, n *= 10) {

}

我编写这段代码是为了了解一个数字是否有小数部分。

在循环结束时,“i”应该是 4,但由于某种原因,计数器不会增加。

除了你可能不喜欢我的解决方案,你有什么建议吗?

【问题讨论】:

  • 由于浮点数不准确,最好检查if ((int)n - n) < epsilon)...
  • 在您粘贴的代码中,无法知道循环末尾的 i 是什么。请发布您的真实代码。
  • @H2CO3 他在做模数运算之前很久就开始了,这很好。这里没有进行浮点比较。
  • @Joost 我知道,我是说1.3243 可能无法完全表示,因此循环可能不会在 OP 认为应该结束的地方结束......
  • @Joost 当然,无论哪种情况你都是对的 :) 不用担心。

标签: c++ loops for-loop counter increment


【解决方案1】:

在循环结束时,i 变量不再存在。您在函数范围内声明它。这导致无法在循环外访问它。如果您执行以下操作:

double n = 1.3243;
for (int i = 0; long(n*10) % 10 != 0; i++, n *= 10) {   
}
printf("%d\n", i);

GGC 给我一个loop.cpp:10: error: name lookup of ‘i’ changed for new ISO ‘for’ scoping 错误。

以下将解决这个问题(请注意,如果 for 循环为空,则不需要大括号):

double n = 1.3243;
int i;
for (i = 0; long(n*10) % 10 != 0; i++, n *= 10);
printf("%d\n", i);

使用 GCC 4.2.1,这给了我4 的输出

但是,在测试十进制数时,您提供的循环有一个不方便的错误。正如src remarked 在他的评论中一样,小数点中的零会取消它后面的任何小数点。一旦找到零值,循环就会中断,但后面可能会有更多小数。根据您处理的浮动类型,这可能是一个很大的问题。

请注意:最常见的解决方案是以下比较:

double n = 1.3243;
if (n == (int)n) {
    // do stuff
}

这修复了 src 提出的错误:1.01 is said to have decimals, like it should.循环解决方案(错误地)为此浮点数返回 i=0

当您的浮点数没有任何小数部分时,比较 n == (int)n 返回 true。

作为H2CO3 mentioned,测试浮点数的小数并不是100% 确定的,因为浮点舍入可能会给你一个与你预期的稍有不同的答案。不过,它适用于一般情况,因此您必须自己查看它是否适合您要解决的问题。

【讨论】:

  • 非常感谢 Joost,您出色地解决了我的问题。
【解决方案2】:

您的代码运行良好。 i =0 , n = 1.3243 .. i =1 , n = 13.243 .. i =2 , n = 123.43 .. i =3 , n = 1234.3 然后如果你在 for 循环之外声明“i”则终止你会得到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2023-03-08
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多