他のポスターが示しているように、より良い質問は「小数部がない」とはどういう意味かを定義することかもしれません。(また、私は長いダブルスについて彼らの注意を繰り返します。)どちらの定義が正しいかは、あなたが達成しようとしていることによって異なります。「1e-6以内」が良い定義であることが多いと思いますが、状況によって異なります。
あなたの特定の質問については、おそらくこれが必要です:
-(BOOL) numberHasDecimal: (double) n
{
double integerPart = 0.;
if (fabs(modf(n, &integerPart)) > 0.) // has decimal, like 16.300000 or 6453.353259
return YES;
else
return NO; // has no decimal, like 58.000000 or 9274.000000
}
何が起こっているのかというと、modf関数は小数部分を返し、数値の整数部分を別のdoubleに格納し、そのアドレスを渡す必要があるということです。その名前にもかかわらず、それは「x%y」と同等ではありません。これは、実際には「return x%1.0、提供されたポインターに(x --floor(x))を格納する」と同等です(少なくとも正の数の場合、つまり)。
2番目のポインタパラメータは、単一の関数呼び出しから複数の値を返す方法と考えることができます。この場合、整数部分については気にしませんが、整数部分を書き込むmodfのアドレスを渡すと、コンパイラが静かになり、探している結果が得られます。