fpi*_*o07 1 c++ counter loops for-loop increment
double n = 1.3243;
for (int i = 0; long(n*10) % 10 != 0; i++, n *= 10) {
}
Run Code Online (Sandbox Code Playgroud)
我写了这段代码是为了了解一个数字是否有小数部分.
在循环结束时,'i'应为4,但由于某种原因,计数器不会递增.
除了您可能不喜欢我的解决方案之外,您有什么建议吗?
在循环结束时,i变量不再存在.你在功能范围内声明它.这导致无法在循环外访问它.如果您执行以下操作:
double n = 1.3243;
for (int i = 0; long(n*10) % 10 != 0; i++, n *= 10) {
}
printf("%d\n", i);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
使用GCC 4.2.1,这给了我输出 4
但是在测试十进制数时,你提出的循环有一个不方便的错误.正如src在他的评论中所说的那样,小数点后面的零会取消后面的任何小数.一旦找到零值,循环就会中断,但可能会有更多的小数.根据您正在处理的浮动类型,这可能是一个非常大的问题.
请注意:最常见的解决方案是以下比较:
double n = 1.3243;
if (n == (int)n) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
这修复了src提供的错误:1.01据说有小数,就像它应该的那样.循环解决方案(错误地)返回i=0此浮点数.
n == (int)n当您的float没有任何小数部分时,比较返回true.
正如H2CO3所提到的,测试浮点数的小数不是100%明确的,因为浮点舍入可能会给你一个与你期望的略有不同的答案.但是它适用于一般情况,所以你必须亲自看看它是否适合你正在解决的问题.