2012-03-29 17 views
0

Ich weiß, dass es zu SO bereits viele verschiedene Fragen zu SO gibt, aber ich konnte keine Möglichkeit finden, sie alle auf meine spezifischen Bedürfnisse abzustimmen.Dynamische Rundungszahlen in Objective-C

Was ich habe, ist eine Fließkommazahl, die mir über das Netzwerk gesendet wird, das ich konvertieren und auf dem Bildschirm grafisch darstellen muss. Die Zahlen können zwischen 5,2, 285,159, 294729172,258, -10734,112 usw. liegen. Was ich tun möchte, ist, den Wert, der zum Runden verwendet wird, von einer Ziffer unterhalb der höchstwertigen Ziffer zu erhalten.

Beispiel:

5.2 = 5 
285.159 = 300 
294729172.258 = 300000000 
-10734.112 = -11000 

Jede Beratung, die verwendet werden können, um mir zu helfen führen würde sehr geschätzt werden.

+1

Und 294729172.258 bis 300000000? Sie müssen ein Rundungskriterium definieren und Ihre Rundungsfunktion ausführen. – fbernardo

+0

Ich würde denken, dass 5,2 = 5 aber so etwas wie 5,5 = 6 – Seb

Antwort

3

Hier ist meine Lösung:

int roundMostSignificant(float input) 
{ 
    NSNumber *number = [NSNumber numberWithFloat:input]; 
    static NSNumberFormatter *formatter = nil; 

    if (!formatter) 
    { 
     formatter = [NSNumberFormatter new]; 
     [formatter setMinimumSignificantDigits:1]; 
     [formatter setMaximumSignificantDigits:1]; 
     [formatter setUsesSignificantDigits:YES]; 
    } 

    return [[formatter numberFromString:[formatter stringFromNumber:number]] intValue]; 
} 

Ja, diese Objekte verwendet, aber ich denke, dass dies die beste Wahl auf lange Sicht sein wird, wie es Rundungsanfasser, Parsing, etc. für Sie.

+0

Sie sind Gott wie dafür. Ich danke dir sehr! Wenn möglich, könntest du erklären, was das im Hintergrund tut, oder auf eine Dokumentation verweisen, die diesen Prozess beschreibt? Ich möchte so viel lernen wie ich kann. – Seb

+0

+1. Und @Seb, das ergibt '-10000' für' -10734.112', was logischer ist als das von dir erwähnte Ergebnis: '-11000'. – sch

+0

@Seb was das zuerst macht, nimmt eine Fließkommazahl als Eingabe. Dann wandelt es diese Fließkommazahl in eine Zeichenkette um, die auf 1 signifikante Zahl gerundet wird, dann erstellt sie eine Zahl aus dieser Zeichenkette und gibt diese Zahl zurück. –

1

Es gibt eine NSDecimalNumber und NSDecimalNumberHandler Klassen, die genau das tut. Sie können festlegen, auf welche Genauigkeit und in welche Richtung die Zahlen gerundet werden sollen.

Einfaches Beispiel könnte sein:

NSDecimalNumber *dn = [NSDecimalNumber decimalNumberWithMatnissa:294729172258 exponent:-3 isNegative:NO]; 
NSDecimalNumberHandler *dnh = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:-6 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES]; 

NSDecimalNumber *rounded = [dn decimalNumberByRoundingAccordingToBehavior:dnh]; 

Dies ist wahrscheinlich für die größte Zahl funktionieren würde.

Verwandte Themen