如何创建以下方法?

  • 我试图使用MODF(N,1)或MODF(N,2),但是它们都返回一个错误的“传递MODF的参数2”使Integer的指针无需铸造。

这是该方法:

(BOOL) numberHasDecimal: (long double) n {
    if (?????) // has decimal, like 16.300000 or 6453.353259
        return YES;
    else
        return NO; // has no decimal, like 58.000000 or 9274.000000
}
有帮助吗?

解决方案

if (fabsl(fmodl(n, 1.0)) > 0.0) {
    // Has a decimal.
} else {
    // Is an integer.
}

请记住,浮点值以违反直觉的方式进行内部舍入,因此数字可能具有很小的分数,并且在通过时仍然看起来不可或缺 fmodl().

另请注意,苹果在处理时的实施是破坏的 long double 值时,使用错误时可能会出现难以传播的错误。

其他提示

另一个选择,不知道该选择哪个,但可能不是这个选择。

-(BOOL) numberHasDecimal: (long double) n {
    NSMutableString *decimalTempString;
    decimalTempString = [NSMutableString stringWithFormat: @"%Lf", n];

    // while last character of string = 0 delete last character  (1232.10000)
    while ([decimalTempString characterAtIndex:([decimalTempString length] -1)] == '0') {
        NSRange range = {([decimalTempString length] -1), 1};
        [decimalTempString deleteCharactersInRange:range];
    }
    // if last character is . then delete that too  (1232.)
    if ([decimalTempString characterAtIndex:([decimalTempString length] -1)] == '.') {
        return NO; // has no decimal, like 58. or 9274.
    } else {
        return YES; // has decimal, like 16.3 or 6453.353259
    }

正如其他海报所指出的那样,一个更好的问题可能是定义“没有小数部分”的含义。 (另外,我回应了他们对长加倍的注意。)哪个定义是正确的,取决于您要实现的目标。我发现“ 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-落(x))存储到提供的指针中”(至少对于正数,也就是。)

您可以将第二个指针参数视为一种从单个函数调用中返回多个值的方式。即使您不在乎,在这种情况下,对于整数部分,传递了MODF将整数零件写入的地址将使编译器安静下来,并为您提供所需的结果。

- (BOOL) numberHasDecimal:(long double)l {
  return (floorl(l) != l);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top