Question

Comment puis-je créer la méthode suivante?

  • I ont essayé d'utiliser modf (n, 1) ou modf (n, 2), mais les deux retour une erreur de « Passe argument 2 de modf fait pointeur de nombre entier sans plâtre.

Heres la méthode:

(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
}
Était-ce utile?

La solution

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

Gardez à l'esprit que les valeurs à virgule flottante sont arrondies à l'intérieur de façon contre-intuitive, de sorte qu'un nombre peut avoir une composante fractionnaire très faible et apparaissent toujours intégrante lorsqu'il est passé par fmodl().

A noter également que la mise en œuvre d'Apple de l'Objective-C est cassé lors de la manipulation des valeurs de long double et peut se manifester par des erreurs difficiles à piste lorsque vous les utilisez.

Autres conseils

Un autre choix, ne sais pas lequel choisir, mais probablement pas celui-ci.

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

Comme d'autres l'ont indiqué, une meilleure question pourrait être de définir ce que signifie « ne pas avoir une partie décimale ». (De plus, je fais écho à leurs mises en garde sur les doubles longues.) Quelle définition est juste dépend de ce que vous essayez d'atteindre. Je trouve que « dans 1E-6 » est souvent une bonne définition, mais cela dépend de la situation.

Pour votre question spécifique, vous voulez probablement ceci:

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

Qu'est-ce qui se passe est que la fonction modf veut retourner la partie décimale et stocker la partie entière du nombre dans un autre double, dont l'adresse que vous passez en elle. Malgré son nom, il est l'équivalent de « x% y »; il est vraiment plus l'équivalent de « retour x 1,0%, le stockage aussi (x - floor (x)) dans le pointeur fourni » (au moins pour les nombres positifs, qui est.)

Vous pouvez penser à la seconde, le paramètre de pointeur comme un moyen de revenir plus d'une valeur à partir d'un seul appel de fonction. Même si vous ne vous inquiétez pas, dans ce cas, de la partie entière, en passant une adresse pour modf d'écrire la partie entière dans apaisera le compilateur et vous obtenez le résultat que vous recherchez.

- (BOOL) numberHasDecimal:(long double)l {
  return (floorl(l) != l);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top