2つのNSNumberオブジェクトを追加するには?
-
20-08-2019 - |
質問
さて、これは簡単でなければなりませんが、どのように2 NSNumber
を合計することができますか?以下のようなものです:
[one floatValue] + [two floatValue]
またはより良い方法を存在する?
解決
があり、本当に良い方法はありませんが、あなたはそれを避けることができれば、あなたは本当にこれを実行すべきではありません。あなたがコレクションに保存し、他のNSNumber
で多形、それらを渡すことができるようにNSObjects
はスカラー番号へのラッパーとして存在しています。彼らは本当に実際の数学で数値を格納するために使用されていません。あなたがそれらに数学を行う場合は、それはそれのための便利なメソッドが存在しない理由はおそらくである、ちょうどスカラー上で操作を実行するよりもはるかに遅います。
例
NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];
メッセージのディスパッチに最小21回の指示で吹いている、および方法は、値をUnboxのために取るとreboxしかし、多くのコード(おそらく数百)は、数学の1つの命令の価値を行うには、
あなたはあなただけのスカラCタイプと数学のスティックを行いたい場合は、関数に数値または文字列がNSNumber
を使うかもしれない何かを渡す必要がある場合、NSNumber
を使用しますが、dictsに数値を格納する必要があるのであれば。
他のヒント
NSDecimalNumberする(サブクラスするNSNumber
:の)あなたが探しているすべてのグッズを持っています– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:
...
コンピューティング性能が重要である場合、は、C ++の配列のstd ::ベクトルに変換など。
今、私はもうC-配列を使用することはありません。間違ったインデックスまたはポインタを使用してクラッシュすることも簡単です。ペアすることは非常に面倒なすべての新しい[]で、削除[]。
あなたが使用することができます。
NSNumber *sum = @([first integerValue] + [second integerValue]);
編集:
ohho で観察されたように、この例では、整数値を保持する2つのNSNumber
インスタンスを加算するためのものです。あなたは浮動小数点値を保持している2つのNSNumber
年代を追加したい場合は、以下を行う必要があります:
NSNumber *sum = @([first floatValue] + [second floatValue]);
現在のトップ投票回答のが原因にハード・ツー・診断バグや精度の損失につながるとしています山車の使用。あなたがするNSNumber値の数字の操作をやっている場合は、まずNSDecimalNumberに変換し、代わりにこれらのオブジェクトを使用して操作を実行する必要があります。
ドキュメントするます:
NSDecimalNumber、のNSNumberの不変サブクラスは、ベース10の演算を行うためのオブジェクト指向のラッパーを提供します。インスタンスは、仮数は、最大38桁の10進整数であり、指数は127を介して-128の整数である仮数×10 ^指数として表すことができる任意の数を表すことができます。
そのため、あなたが完了したら、その後のNSNumberに戻って割り当てることが好きな算術演算を実行、[NSNumber decimalValue]
の方法によりNSDecimalNumbersにあなたのNSNumberインスタンスを変換する必要があります。
Objective-Cで
NSDecimalNumber *a = [NSDecimalNumber decimalNumberWithDecimal:one.decimalValue]
NSDecimalNumber *b = [NSDecimalNumber decimalNumberWithDecimal:two.decimalValue]
NSNumber *result = [a decimalNumberByAdding:b]
スイフト3:
let a = NSDecimalNumber(decimal: one.decimalValue)
let b = NSDecimalNumber(decimal: two.decimalValue)
let result: NSNumber = a.adding(b)
なぜ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"
また、このように、異なる引数を評価するために再利用することができNSExpressionを構築することができます
NSExpression *expr = [NSExpression expressionWithFormat: @"(X+Y)"];
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", y, @"Y", nil];
NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);
は、例えば、我々はループ同じ解析された式を評価することができ、異なる「Y」の値を有する各時間:
for (float f=20; f<30; f+=2.0) {
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", @(f), @"Y", nil];
NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);
}
スウィフトでは、Bolt_Swiftライブラリ https://github.com/williamFalcon/Bolt_Swift <を使用してこの機能を得ることができます/>。
例:
var num1 = NSNumber(integer: 20)
var num2 = NSNumber(integer: 25)
print(num1+num2) //prints 45