2012-07-08 20 views
6

NSNumberで簡単な算術演算を行い、その型を保持したいと考えています。これは可能ですか?例えばNSNumberの算術

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

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

[NSNumber objCType]を使用してタイプ(ブール値を除く)を得ることができます:get type of NSNumberしかし、私はこれらのタイプを抽出して値を抽出するためのコードなしで計算を行うことはできません。可能なすべての型の結果を返します。

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

+0

種類が異なる場合はどうしたらいいですか? –

+0

エラーをスローするか、firstNumberタイプをテンプレートとして使用してください。両方とも私が必要とするもののために働くだろう。 –

+0

それを行うための簡潔な方法はありません。 – sosborn

答えて

10

算術演算を実行する場合は、NSDecimalNumberを使用してください。

NSDecimalNumberは次のように算術演算を実行するためのメソッドがあります:

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

をそしてNSDecimalNumberがするNSNumberを拡張するので、それはまたのNSNumberのすべてのメソッドを持っているので、私はあなたが何の問題もなく、あなたのケースでそれを使用することができると思います。

+0

私はCocoa Touchで1年以上働いており、このクラスについて聞いたことはありません!!クレイジー!! +1! – borrrden

3

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

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

参照:How to add two NSNumber objects?

2

方法(double型の値としてすべての入力との)二重のような発現値を計算し、その結果が整数であるかどうかをチェックするでしょうか?結果を返すには、NSNumber numberWithInt:またはNSNumber numberWithDouble:を使用します。

結果の値が整数かどうかを確認するときは、丸め誤差(例:1が0.99999999などの場合)を考慮してください。

EDIT:ただのNSNumberのためのドキュメントに気づいたこのフレーズ:

ノート数のオブジェクトは必ずしも彼らが作成した あるタイプを保存しないこと。

これは、あなたがしようとしていることを確実に行うことができないと思います。

+0

あなたはそれを遠くにする必要はありません。 NSNumberのポイントは、それを抽象化することです。それは完全に満足しているだけでダブルスを使用しています。あなたはNSNumberを返すので、あなたが入れているものに関係なく、あなたが望む任意の表現を引き出すことができます。私が作ったスニペットを見てください:http://ideone.com/HwIOa – borrrden

+0

私はあなたを聞いています!私は個人的にこれのいずれかを行う必要があることを疑う:)私はちょうどOPの問題を解決しようとしていた。これが物事の壮大な体系で意味をなさないかどうかは、別の疑問であり、私はそれを言うのに十分な文脈を持っていません。 – Macondo2Seattle