1
double n = 1.3243;
for (int i = 0; long(n*10) % 10 != 0; i++, n *= 10) {

}

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

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

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

4

2 回答 2

8

在循环结束时, 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在他的评论中所说,小数点中的零会取消它后面的任何小数点。一旦找到零值,循环就会中断,但后面可能会有更多小数。根据您正在处理的浮动类型,这可能是一个相当大的问题。

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

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

这修复了 src: 1.01is said to have decimals 出现的错误,就像它应该的那样。循环解决方案(错误地)i=0为此浮点数返回。

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

正如H2CO3 所提到的,测试浮点数的小数并不是 100% 确定的,因为浮点舍入可能会给您一个与您预期的略有不同的答案。但是,它适用于一般情况,因此您必须自己查看它是否适合您正在解决的问题。

于 2012-12-08T09:13:49.680 回答
1

你的代码工作正常。i =0 , n = 1.3243 .. i =1 , n = 13.243 .. i =2 , n = 123.43 .. i =3 , n = 1234.3 如果你在 for 循环之外声明“i”然后终止你会得到它。

于 2012-12-08T09:16:38.293 回答