Frage

NSTimeInterval == double; (Z.B. 169,12345666663)

Wie kann ich dieses Doppel aufrunden so, dass es nur zwei Ziffern links nach dem „Punkt“?
Es wäre sehr gut, wenn das Ergebnis eine NSNumber ist.

War es hilfreich?

Lösung

Wenn dies für die Anzeige ist, werfen Sie einen Blick auf NSNumberFormatter .

Wenn Sie wirklich beides in Ihren Berechnungen aus irgendeinem Grunde runden möchten, können Sie die Standard-C-round()-Funktion verwenden.

Andere Tipps

Ein NSDecimal kann mit NSDecimalRound () .

double d = [[NSDate date] timeIntervalSince1970];
NSDecimal in = [[NSNumber numberWithDouble:d] decimalValue];
NSDecimal out;
NSDecimalRound( &out, &in, 2, NSRoundUp );

NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithDecimal:out];

Wenn Sie wirklich zwei Ziffern wollen links nach dem Punkt, mit 100 multipliziert, um sie herum Funktion round (), teilen sie durch 100 wieder. Dies wird jedoch nicht garantieren, dass es wirklich nur zwei Ziffern nach dem Punkt hat, da durch sie wieder teilen, können Sie eine Nummer erhalten, die mit Floating-Point nicht wirklich ausgedrückt Notation werden kann und wenn man 0,1 erwarten Sie in der Tat 0,09999 bekommen können .. ., das ist, weil Sie 0,1 mit Gleitkommadarstellung nicht wirklich ausdrücken können.

Wenn Sie es gerade nach dem Punkt für die Anzeige auf zwei Stellen runden möchten, können Sie NSNumberFormatter verwenden, wie vorgeschlagen wurde oder nur verwenden:

printf("%.2f\n", yourTimeInterval);
NSLog(@"%.2f\n", yourTimeInterval);

oder ein NSString zu erhalten, können Sie auch die folgenden Befehle verwenden, die wahrscheinlich ist sogar schneller als ein NumberFormatter mit (wird es jedoch nicht lokalisiert werden nach den Nutzereinstellungen):

NSString * intervalStr = nil;
char * intervalStrTmp = NULL;
asprintf(&intervalStrTmp, "%.2f", yourTimeInteval);
if (intervalStrTmp) {
  intervalStr = [[NSString alloc] initWithUTF8String:intervalStrTmp];
  free(intervalStrTmp);
}

In der überwiegenden Mehrzahl der Fälle eine Zahl gerundet ist etwas, das man nur bei Anzeigezeit tun soll. Die Eigenschaften von Gleitkommazahlen (Doppel oder nicht) machen es unmöglich, bei einem Fest Präzision bestimmte Nummern zu speichern.

Weitere Informationen über das Formatieren einer Zahl, so dass es auf zwei Dezimalstellen angezeigt wird, sieht diese anderen post .

Enthält diese HumanReadableTimeInterval helfen? Es gibt eine NSString, though. Alternativ können Sie sich mit 100 durch Multiplikation runden, in eine ganze Zahl konvertieren und wieder durch 100 dividiert wird.

Ich würde nur die ANSI-C round()-Funktion verwenden.

Sie können jederzeit rund um die Nummer mit:

double round2dec(double a) { return round(a * 100) / 100; }

Aber die Chancen sind, dass die Darstellung des Ergebnisses als Doppel wird nicht nur 2 Dezimalstellen hat.

Wenn nun durch das == Zeichen verwendet wird, bedeutet, dass der Vergleich Ihrer zwei Doppelnummern nur auf die zweite Dezimalstelle gemacht. Hier ist, was Sie tun können:

fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top