0

如何创建以下方法?

  • 我曾尝试使用 modf(n, 1) 或 modf(n, 2) 但它们都返回错误“传递 modf 的参数 2 使指针从整数而不进行强制转换。

方法如下:

(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
}
4

4 回答 4

0

正如其他海报所指出的那样,一个更好的问题可能是定义“没有小数部分”的含义。(另外,我赞同他们对长双打的警告。)哪个定义是正确的取决于你想要达到的目标。我发现“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 写入整数部分将使编译器安静下来并为您提供您正在寻找的结果。

于 2010-12-30T22:04:15.650 回答
0
if (fabsl(fmodl(n, 1.0)) > 0.0) {
    // Has a decimal.
} else {
    // Is an integer.
}

请记住,浮点值在内部以违反直觉的方式四舍五入,因此数字可能具有非常小的小数部分,并且在传递时仍然显示为整数fmodl()

另请注意,Apple 的 Objective-C 实现在处理long double值时被破坏,并且在您使用它们时可能会出现难以跟踪的错误。

于 2010-12-30T18:16:43.360 回答
0
- (BOOL) numberHasDecimal:(long double)l {
  return (floorl(l) != l);
}
于 2010-12-30T20:34:08.797 回答
0

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

-(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
    }
于 2010-12-30T20:17:58.140 回答