回答
有没有更好的方法,但如果你能避免它,你真的不应该这样做。 NSNumber
作为标量数字的包装存在,因此您可以将它们存储在集合中,并将它们与其他NSObjects
进行多态传递。它们并不是真的用来存储实际数学中的数字。如果你对它们进行数学计算,它比仅对标量执行操作要慢得多,这可能是为什么没有方便的方法。
例如:
NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];
是最小的21个指令吹消息调度,并且也不管代码的方法采取拆箱和REBOX值(可能是几百)做1个指令价值的数学。
所以,如果你需要存储的类型的字典号码使用NSNumber
,如果你需要传递的东西,可能是一个数字或字符串成一个函数使用NSNumber
,但如果你只想做数学棒与标C型。
NSDecimalNumber(的NSNumber子类)拥有所有你正在寻找的东西:
– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:
...
如果计算性能很感兴趣,然后转换为C++数组的std ::向量或喜欢。
现在我从不再使用C阵列了;使用错误的索引或指针很容易崩溃。并且非常繁琐地将每个新的[]与delete []配对。
您可以使用
NSNumber *sum = @([first integerValue] + [second integerValue]);
编辑: 如ohho观察到,这个例子是用于相加持有整数值的两个NSNumber
实例。如果你想加起来持有浮点值的两个NSNumber
的,你应该做到以下几点:
NSNumber *sum = @([first floatValue] + [second floatValue]);
在斯威夫特您可以通过使用Bolt_Swift库https://github.com/williamFalcon/Bolt_Swift得到这个功能。
例子:
var num1 = NSNumber(integer: 20)
var num2 = NSNumber(integer: 25)
print(num1+num2) //prints 45
目前top-voted answer将会导致难以诊断的错误和精度损失由于使用花车。如果您正在对NSNumber值进行数字操作,则应先转换为NSDecimalNumber,然后对这些对象执行操作。
NSDecimalNumber,NSNumber的的不可变的子类,提供了这样做的基10算术的面向对象的包装。一个实例可以表示可被表示为尾数×10 ^指数任何数,其中尾数是十进制整数高达38位长,和指数是从-128至127
的整数。因此,应转换你的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)
- 1. 添加两个pandas.series对象
- 2. 如何增加一个NSNumber
- 3. 添加两个json对象并排序
- 4. 添加java对象两次
- 5. 钛如何添加2合并两个Ti.Media.sound对象?
- 6. 添加对象到NSArray作为NSNumber numberWithBool:NO - ObjC到Xamarin
- 7. 添加对象关联两个现有对象
- 8. 如何将对象添加到对象?
- 9. 如何向JComponent添加多个对象?
- 10. Swift 3创建一个NSNumber对象
- 11. 铸造为一个NSNumber的doubleValue添加额外[幻象]精度
- 12. 如何将对象添加到对象的每个阵列
- 13. 如何在Javascript中的另一个对象内添加对象?
- 14. 如何确定对象是否是一个NSNumber
- 15. 两次添加相同的对象
- 16. 添加到一个对象
- 17. 将两个动画添加到一个对象[到图像]
- 18. 添加对象到对象
- 19. 添加对象
- 20. 如何将两个不同范围对象中的值添加到angularjs中的单个范围对象中
- 21. 如何在PowerShell中的多个JSON对象添加到一个JSON对象
- 22. 如何将第二个对象的值添加到第一个对象?
- 23. 如何将一个modelAndView对象添加到另一个ModelAndView对象
- 24. 如何将downloadUrl添加到firebaseDB对象?
- 25. 如何添加对象到场景?
- 26. 如何在three.js中添加边对象?
- 27. 如何通过对象添加z-index?
- 28. 如何将NSMutableArray添加到对象中?
- 29. 如何将NSDictionary对象添加到NSMutableArray?
- 30. 如何添加到用户对象Node.JS
我想补充一点,如果你需要存储,你打算做了很多数学数的集合 - 也许你真的想要一个适当的数字类型的C风格的数组? – 2009-01-30 06:53:41
无论何时你需要使用标量来进行大量的数学运算,当你需要多态性或需要适应现有的容器时,您都希望使用这些对象。 – 2009-01-30 07:36:02
NSNumber上的正确方法是'numberWithFloat:' - 也许这从回答时起就已经改变了。 – Nick 2010-11-30 03:29:21