double n = 1.3243;
for (int i = 0; long(n*10) % 10 != 0; i++, n *= 10) {
}
数値に小数部分があるかどうかを理解するために、このコードを作成しました。
ループの最後で 'i' は 4 になるはずですが、何らかの理由でカウンターが増加しません。
私の解決策が気に入らないかもしれないという事実を除いて、何か提案はありますか?
ループの最後に、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)n
float に小数部分がない場合、比較は true を返します。
H2CO3が述べたように、浮動小数点の丸めは予想とはわずかに異なる答えを与える可能性があるため、浮動小数点数の小数をテストすることは 100% 明確ではありません。ただし、一般的なケースでは機能するため、解決しようとしている問題に適合するかどうかを自分で確認する必要があります。
あなたのコードは正常に動作しています。i =0 , n = 1.3243 .. i =1 , n = 13.243 .. i =2 , n = 123.43 .. i =3 , n = 1234.3 for ループの外で「i」を宣言すると終了します。それ。