现在,这一定很容易,但是如何求和两个NSNumber
呢?就好像:
[one floatValue] + [two floatValue]
还是存在更好的方法?
Answers:
确实没有更好的方法,但是如果可以避免的话,您实际上不应该这样做。NSNumber
作为标量数字的包装器而存在,因此您可以将它们存储在集合中,并与其他变量进行多态传递NSObjects
。它们并没有真正用于在实际数学中存储数字。如果对它们进行数学运算,则比仅对标量执行运算要慢得多,这可能就是为什么没有便捷方法的原因。
例如:
NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];
在消息分发上至少要消耗21条指令,但是该方法需要花费大量代码来对取消装箱并重新装箱值(可能是几百个)来完成1条指令的数学运算。
因此,如果您需要将数字存储在字典中,请使用NSNumber
,如果您需要将可能是数字或字符串的内容传递给函数,请使用NSNumber
,但是如果您只想对标量C类型进行数学计算。
NSDecimalNumber(NSNumber的子类)具有您正在寻找的所有好东西:
– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:
...
如果您对计算性能感兴趣,请转换为C ++数组std :: vector或类似物。
现在,我不再使用C-Arrays。使用错误的索引或指针崩溃很容易。将每个新[]与delete []配对非常麻烦。
NSDecimalNumber
,如何将NSDecimalNumber
结果转换 回NSNumber
?(这个问题是关于增加两个的NSNumber
S,不增加两个NSDecimalNumber
秒)
@interface NSDecimalNumber : NSNumber
您可以使用
NSNumber *sum = @([first integerValue] + [second integerValue]);
编辑:正如ohho所观察到的,此示例用于将两个NSNumber
保存整数值的实例相加。如果要加总两个NSNumber
包含浮点值的,则应执行以下操作:
NSNumber *sum = @([first floatValue] + [second floatValue]);
int
或long
或它的大哥哥typedef
“编NSInteger
入NSNumber
的对象。
integerValue
截断float
。如何回答这个答案?
integerValue
如果想保留数字的小数部分,为什么还要使用世界呢?
当前投票最多的答案将导致难以诊断的错误,以及由于使用浮点数而导致的精度损失。如果要对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]
在Swift 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可以重复使用以使用不同的参数求值,如下所示:
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]);
}
在Swift中,您可以使用Bolt_Swift库https://github.com/williamFalcon/Bolt_Swift获得此功能。
例:
var num1 = NSNumber(integer: 20)
var num2 = NSNumber(integer: 25)
print(num1+num2) //prints 45