6

NSNumbers で簡単な演算を実行し、型を保持したいと考えています。これは可能ですか?

例えば:

- (NSNumber *)add:(NSNumber *)firstNumber to:(NSNumber *)secondNumber;

は私のメソッド定義であり、firstNumber と secondNumber は整数であり、両方の整数加算である整数を返したいと思います。同様に、両方が double の場合は、結果を double として返します。

[NSNumber objCType]この質問にあるように、ブール値を除く型を取得できるように見えます: NSNumber の型を取得しますが、これらの型を抽出して、値を抽出するための多くのコードなしで計算を行うことができないようです。可能なすべてのタイプの結果を返します。

これを行うための短くて簡潔な方法はありますか?

4

3 に答える 3

10

算術演算を実行する場合、最善の策はNSDecimalNumberを使用することです。

NSDecimalNumberには、次のような算術演算を実行するメソッドがあります。

– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:
– decimalNumberByMultiplyingByPowerOf10:
– decimalNumberByAdding:withBehavior:
– decimalNumberBySubtracting:withBehavior:
– decimalNumberByMultiplyingBy:withBehavior:
– decimalNumberByDividingBy:withBehavior:
– decimalNumberByRaisingToPower:withBehavior:
– decimalNumberByMultiplyingByPowerOf10:withBehavior:

また、NSDecimalNumberはNSNumberを拡張するため、NSNumberのすべてのメソッドも含まれているため、問題なく使用できると思います。

于 2012-07-08T08:31:28.207 に答える
3

ほぼすべてのアプリケーションで、doubleと を使用して との-doubleValue間で変換しても問題ありません–initWithDouble:。これにより、標準の C 記号 (+、-、​​...) と関数 ( exp()sin()) を使用できるようになります。問題が発生する唯一の方法は、64 ビット整数値に完全に近い精度を使用していた場合です。

Objective-C クラスの操作に固執したい場合は、NSDecimalNumber代わりに使用できます。

参照: 2 つの NSNumber オブジェクトを追加するには?

于 2012-07-08T07:25:01.887 に答える
2

式の値を double として (すべての入力を double 値として) 計算し、結果が整数であるかどうかを確認するのはどうですか? 次に、NSNumber numberWithInt:orNSNumber numberWithDouble:を使用して結果を返します。

結果の値が整数かどうかを確認するときは、必ず丸め誤差を考慮してください (たとえば、1 が 0.99999999 と表現される場合など)。

編集: NSNumber のドキュメントでこのフレーズに気付きました:

数値オブジェクトは、作成時の型を必ずしも保持しないことに注意してください。

これは、やろうとしていることを確実に行うことができないことを意味すると思います。

于 2012-07-08T07:28:34.960 に答える