Цель C: Создание Long Double использует десятичный метод - PullRequest
0 голосов
/ 30 декабря 2010

Как мне создать следующий метод?

  • Я пытался использовать modf (n, 1) или modf (n, 2), но оба возвращают ошибку «Передача аргумента 2 изmodf делает указатель из целого числа без приведения.

Вот метод:

(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 ]

0 голосов
/ 31 декабря 2010

Как указали другие авторы, лучшим вопросом может быть определение того, что означает «отсутствие десятичной части». (Кроме того, я повторяю их предостережения относительно длинных пар.) Какое определение правильно, зависит от того, чего вы пытаетесь достичь. Я считаю, что «в пределах 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 для записи целочисленной части успокоит компилятор и даст вам нужный результат.

0 голосов
/ 30 декабря 2010

Еще один выбор, не знаю, какой выбрать, но, вероятно, не этот.

-(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
    }
0 голосов
/ 30 декабря 2010
- (BOOL) numberHasDecimal:(long double)l {
  return (floorl(l) != l);
}
0 голосов
/ 30 декабря 2010
if (fabsl(fmodl(n, 1.0)) > 0.0) {
    // Has a decimal.
} else {
    // Is an integer.
}

Имейте в виду, что значения с плавающей запятой внутренне округляются нелогичным образом, поэтому число может иметь очень малую дробную составляющую и все равно выглядеть целым при прохождении через fmodl().

Такжеобратите внимание, что реализация Apple Objective-C не работает при обработке значений long double, и при их использовании могут возникнуть трудно отслеживаемые ошибки.

...