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

しかし、あなたが提示したループには、10進数をテストするときに不便なバグがあります。src がコメントで述べたように、小数点以下のゼロはその後ろの小数点以下をキャンセルします。ループはゼロ値を見つけるとすぐに中断しますが、さらに小数が続く可能性があります。扱っているフロートの種類によっては、これはかなりの問題になる可能性があります。

注:最も一般的な解決策は、次の比較です。

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

これにより、src: で表示されるエラーが修正されます1.01。ループの解は (誤って)i=0この float に対して返されます。

n == (int)nfloat に小数部分がない場合、比較は 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 に答える