正如其他海报所指出的那样,一个更好的问题可能是定义“没有小数部分”的含义。(另外,我赞同他们对长双打的警告。)哪个定义是正确的取决于你想要达到的目标。我发现“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”;它实际上更相当于“返回 x % 1.0,也将 (x - floor(x)) 存储到提供的指针中”(至少对于正数来说。)
您可以将第二个指针参数视为从单个函数调用返回多个值的一种方式。即使您不在乎,在这种情况下,关于整数部分,传递一个地址为 modf 写入整数部分将使编译器安静下来并为您提供您正在寻找的结果。