mam*_*mcx 77 math objective-c nsnumber
现在这一定很容易,但两个怎么样NSNumber
?就好像:
[one floatValue] + [two floatValue]
Run Code Online (Sandbox Code Playgroud)
还是存在更好的方式?
Lou*_*arg 142
没有更好的方法,但如果你能避免它,你真的不应该这样做.NSNumber
作为标量数字的包装器存在,因此您可以将它们存储在集合中,并以多态方式将它们与其他数据一起传递NSObjects
.它们并不真正用于在实际数学中存储数字.如果你对它们进行数学运算,它比仅对标量执行操作要慢得多,这可能就是为什么没有方便的方法.
例如:
NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];
Run Code Online (Sandbox Code Playgroud)
在消息调度上至少有21个指令,无论这些方法需要多少代码来取消装箱并重新装箱值(可能是几百个)来完成1指令的数学运算.
因此,如果您需要在dicts中存储数字,请使用a NSNumber
,如果您需要将可能是数字或字符串的内容传递给函数,请使用NSNumber
,但如果您只是想使用标量C类型进行数学操作.
Sem*_*mel 48
NSDecimalNumber(NSNumber的子类)拥有您正在寻找的所有好东西:
– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:
Run Code Online (Sandbox Code Playgroud)
...
如果感兴趣的是计算性能,那么转换为C++数组std :: vector等.
现在我再也不用C-Arrays了; 使用错误的索引或指针很容易崩溃.将每个new []与delete []配对非常繁琐.
nem*_*sis 12
您可以使用
NSNumber *sum = @([first integerValue] + [second integerValue]);
Run Code Online (Sandbox Code Playgroud)
编辑:正如ohho所观察到的,这个例子是用于添加两个NSNumber
保存整数值的实例.如果要添加两个NSNumber
包含浮点值的值,则应执行以下操作:
NSNumber *sum = @([first floatValue] + [second floatValue]);
Run Code Online (Sandbox Code Playgroud)
当前投票最多的答案将导致难以诊断的错误,以及由于使用浮点数而导致的精度损失。如果要对NSNumber值进行数字运算,则应首先转换为NSDecimalNumber,然后对这些对象执行运算。
从文档中:
NSDecimalNumber是NSNumber的不变子类,它提供了一个面向对象的包装器,用于进行10进制算法。一个实例可以表示任何可以表示为尾数x 10 ^指数的数字,其中尾数是一个十进制整数,最长38位,而指数是一个从–128到127的整数。
因此,您应该通过来将NSNumber实例转换为NSDecimalNumbers [NSNumber decimalValue]
,执行所需的任何算法,然后在完成后将其分配回NSNumber。
在Objective-C中:
NSDecimalNumber *a = [NSDecimalNumber decimalNumberWithDecimal:one.decimalValue]
NSDecimalNumber *b = [NSDecimalNumber decimalNumberWithDecimal:two.decimalValue]
NSNumber *result = [a decimalNumberByAdding:b]
Run Code Online (Sandbox Code Playgroud)
在Swift 3中
let a = NSDecimalNumber(decimal: one.decimalValue)
let b = NSDecimalNumber(decimal: two.decimalValue)
let result: NSNumber = a.adding(b)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
89335 次 |
最近记录: |