Frage

Wie erstelle ich die folgende Methode?

  • Ich habe versucht, MODF (N, 1) oder MODF (N, 2) zu verwenden, aber beide geben einen Fehler zurück, in dem "Argument 2 von Modf das Übergeben von MODF macht, von Ganzzahl ohne Guss.

Hier ist die Methode:

(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
}
War es hilfreich?

Lösung

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

Denken Sie daran, dass schwimmende Punktwerte in kontraintuitiver Weise intern abgerundet werden, sodass eine Zahl möglicherweise eine sehr kleine Bruchkomponente aufweist und immer noch ein wesentlicher Bestandteil des Durchgangs erscheint fmodl().

Beachten Sie auch, dass die Implementierung von Objektiv-C durch Apple beim Handling unterbrochen wird long double Werte und können bei der Verwendung schwere Fehler manifestieren.

Andere Tipps

Eine andere Wahl, nicht wissen, wem Sie auswählen können, aber wahrscheinlich nicht dieses.

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

Wie andere Poster angedeutet haben, könnte eine bessere Frage sein, um zu definieren, was "kein Dezimalteil haben". (Außerdem wiederhole ich ihre Vorsichtsmaßnahmen zu langen Doppel.) Welche Definition ist richtig, was Sie erreichen möchten. Ich finde, dass "innerhalb von 1E-6" oft eine gute Definition ist, aber es hängt von der Situation ab.

Für Ihre spezifische Frage möchten Sie wahrscheinlich Folgendes:

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

Was los ist, ist, dass die MODF -Funktion den fraktionalen Teil zurückgeben und den ganzzahligen Teil der Nummer in ein anderes Doppel speichern möchte, dessen Adresse, die Sie in ihn weitergeben. Trotz seines Namens ist es nicht das Äquivalent von "x % y"; Es ist wirklich eher das Äquivalent von "Return x % 1.0, auch in den bereitgestellten Zeiger (zumindest für positive Zahlen, dh) in den bereitgestellten Zeiger gespeichert (x - Boden (x)).

Sie können sich den zweiten, Zeigerparameter vorstellen, um mehr als einen Wert aus einem einzigen Funktionsaufruf zurückzugeben. Auch wenn es Ihnen egal ist, in diesem Fall über den Ganzzahl -Teil eine Adresse für Modf zu übergeben, um den Ganzzahl -Teil in den Compiler zu schreiben und Ihnen das Ergebnis zu erzielen, nach dem Sie suchen.

- (BOOL) numberHasDecimal:(long double)l {
  return (floorl(l) != l);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top