Как указали другие авторы, лучшим вопросом может быть определение того, что означает «отсутствие десятичной части». (Кроме того, я повторяю их предостережения относительно длинных пар.) Какое определение правильно, зависит от того, чего вы пытаетесь достичь. Я считаю, что «в пределах 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 хочет вернуть дробную часть и сохранить целую часть числа в другой двойник, адрес которого вы передаете в него. Несмотря на название, оно не эквивалентно «x% y»; это действительно больше эквивалент «return x% 1.0, также сохраняя (x - floor (x)) в предоставленном указателе» (по крайней мере, для положительных чисел, то есть.)
Второй параметр указателя можно рассматривать как способ возврата более одного значения из одного вызова функции. Даже если вас не волнует, в данном случае, целочисленная часть, передача адреса для modf для записи целочисленной части успокоит компилятор и даст вам нужный результат.