Das muss einfach sein, aber wie kann man zwei summieren NSNumber
? Ist wie:
[one floatValue] + [two floatValue]
oder gibt es einen besseren Weg?
quelle
Das muss einfach sein, aber wie kann man zwei summieren NSNumber
? Ist wie:
[one floatValue] + [two floatValue]
oder gibt es einen besseren Weg?
Es gibt keinen wirklich besseren Weg, aber Sie sollten dies wirklich nicht tun, wenn Sie es vermeiden können. NSNumber
existiert als Wrapper für skalare Zahlen, sodass Sie sie in Sammlungen speichern und polymorph mit anderen übergeben können NSObjects
. Sie werden nicht wirklich verwendet, um Zahlen in der tatsächlichen Mathematik zu speichern. Wenn Sie mit ihnen rechnen, ist dies viel langsamer als das Ausführen der Operation nur für die Skalare, weshalb es wahrscheinlich keine praktischen Methoden dafür gibt.
Zum Beispiel:
NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];
Bläst mindestens 21 Anweisungen für Nachrichtenversendungen und wie viel Code die Methoden benötigen, um die zu entpacken und die Werte (wahrscheinlich einige hundert) neu zu verpacken, um 1 Befehl im Wert von Mathematik auszuführen.
Wenn Sie also Zahlen in Diktaten speichern müssen, verwenden Sie eine NSNumber
, wenn Sie etwas, das eine Zahl oder eine Zeichenfolge sein kann, an eine Funktion übergeben müssen, verwenden Sie eine NSNumber
, aber wenn Sie nur Mathe-Stick mit skalaren C-Typen ausführen möchten.
NSDecimalNumber (Unterklasse von NSNumber ) bietet alle Extras, die Sie suchen:
...
Wenn die Rechenleistung von Interesse ist, konvertieren Sie sie in das C ++ - Array std :: vector oder ähnliches.
Jetzt benutze ich nie mehr C-Arrays; Es ist zu leicht, mit einem falschen Index oder Zeiger zum Absturz zu kommen. Und sehr mühsam, jedes neue [] mit delete [] zu koppeln.
quelle
NSDecimalNumber
Wie konvertiereNSDecimalNumber
ich das Ergebnis nach dem Hinzufügen von zwei s wieder inNSNumber
? (Diese Frage ist über das Hinzufügen von zweiNSNumber
s, nicht zweiNSDecimalNumber
s hinzufügen .)@interface NSDecimalNumber : NSNumber
Sie können verwenden
NSNumber *sum = @([first integerValue] + [second integerValue]);
Bearbeiten: Wie von ohho beobachtet , dient dieses Beispiel zum Addieren von zwei
NSNumber
Instanzen, die ganzzahlige Werte enthalten. Wenn Sie zwei addieren möchtenNSNumber
, die Gleitkommawerte enthalten, sollten Sie Folgendes tun:NSNumber *sum = @([first floatValue] + [second floatValue]);
quelle
int
oderlong
oder es ist großer Brudertypedef
‚edNSInteger
inNSNumber
Objekte .integerValue
schneidet abfloat
. Wie kann diese Antwort positiv bewertet werden?integerValue
wenn Sie den Dezimalteil der Zahlen beibehalten möchten?Die derzeit am häufigsten gewählte Antwort wird zu schwer zu diagnostizierenden Fehlern und Präzisionsverlusten aufgrund der Verwendung von Floats führen. Wenn Sie Zahlenoperationen für NSNumber-Werte ausführen, sollten Sie zuerst in NSDecimalNumber konvertieren und stattdessen Operationen mit diesen Objekten ausführen.
Aus der Dokumentation :
Daher sollten Sie Ihre NSNumber-Instanzen in NSDecimalNumbers konvertieren
[NSNumber decimalValue]
, eine beliebige Arithmetik ausführen und sie dann einer NSNumber zuweisen, wenn Sie fertig sind.In Ziel-C:
NSDecimalNumber *a = [NSDecimalNumber decimalNumberWithDecimal:one.decimalValue] NSDecimalNumber *b = [NSDecimalNumber decimalNumberWithDecimal:two.decimalValue] NSNumber *result = [a decimalNumberByAdding:b]
In Swift 3:
let a = NSDecimalNumber(decimal: one.decimalValue) let b = NSDecimalNumber(decimal: two.decimalValue) let result: NSNumber = a.adding(b)
quelle
Warum nicht verwenden
NSxEpression
?NSNumber *x = @(4.5), *y = @(-2); NSExpression *ex = [NSExpression expressionWithFormat:@"(%@ + %@)", x, y]; NSNumber *result = [ex expressionValueWithObject:nil context:nil]; NSLog(@"%@",result); // will print out "2.5"
Sie können auch einen NSExpression erstellen, der zur Auswertung mit verschiedenen Argumenten wie folgt wiederverwendet werden kann:
NSExpression *expr = [NSExpression expressionWithFormat: @"(X+Y)"]; NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", y, @"Y", nil]; NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);
Zum Beispiel können wir den gleichen analysierten Ausdruck jedes Mal mit einem anderen "Y" -Wert in einer Schleife auswerten:
for (float f=20; f<30; f+=2.0) { NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", @(f), @"Y", nil]; NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]); }
quelle
In Swift können Sie diese Funktionalität mithilfe der Bolt_Swift-Bibliothek https://github.com/williamFalcon/Bolt_Swift erhalten .
Beispiel:
var num1 = NSNumber(integer: 20) var num2 = NSNumber(integer: 25) print(num1+num2) //prints 45
quelle