Objective c 如何在NSMutableArray中添加所有十进制数
我有一个Objective c 如何在NSMutableArray中添加所有十进制数,objective-c,nsarray,nsdecimalnumber,Objective C,Nsarray,Nsdecimalnumber,我有一个NSMutableArray,里面有一些NSDecimalNumber,比如(500,50.80,708000) 现在我想把所有的十进制数相加 我试着用 for (NSDecimalNumber *number in self.numbersArray) { NSDecimal *sum += [number decimalValue] } 但是失败了。使用-(NSDecimalNumber*)decimalNumberByAdding:(NSDecimalNumber*)de
NSMutableArray
,里面有一些NSDecimalNumber
,比如(500,50.80,708000)
现在我想把所有的十进制数
相加
我试着用
for (NSDecimalNumber *number in self.numbersArray)
{
NSDecimal *sum += [number decimalValue]
}
但是失败了。使用-(NSDecimalNumber*)decimalNumberByAdding:(NSDecimalNumber*)decimalNumber
看看
使用-(NSDecimalNumber*)decimalNumberByAdding:(NSDecimalNumber*)decimalNumber
看看
马诺哈在评论中的建议不错。您确实可以使用以下内容制作一行:
[myArray valueForKeyPath:@“@sum.doubleValue”]代码>,但可能会丢失精度(取决于存储的数字)
您基本上是在寻找“减少”功能;您需要将调用链接到decimalNumberByAdding:
,以便每个调用都有数组的后续元素作为其参数。使用performSelector:withObject:
@implementation NSArray (Reduce)
- (id)reduceUsingSelector: (SEL)sel
{
id res = [self objectAtIndex:0];
for( id obj in [self subarrayWithRange:(NSRange){1, [self count]-1}] ){
res = [res performSelector:sel withObject:obj];
}
return res;
}
@end
这样使用:NSDecimalNumber*sum=[myArray reduceUsingSelector:@selector(decimalNumberByAdding:)]代码>
您的代码没有成功,因为它是一个结构,而不是一个对象;它不应该声明为指针,如果不是,您将无法添加它。这不是解决问题的正确途径。Manohar在评论中的建议不错。您确实可以使用以下内容制作一行:[myArray valueForKeyPath:@“@sum.doubleValue”]代码>,但可能会丢失精度(取决于存储的数字)
您基本上是在寻找“减少”功能;您需要将调用链接到decimalNumberByAdding:
,以便每个调用都有数组的后续元素作为其参数。使用performSelector:withObject:
@implementation NSArray (Reduce)
- (id)reduceUsingSelector: (SEL)sel
{
id res = [self objectAtIndex:0];
for( id obj in [self subarrayWithRange:(NSRange){1, [self count]-1}] ){
res = [res performSelector:sel withObject:obj];
}
return res;
}
@end
这样使用:NSDecimalNumber*sum=[myArray reduceUsingSelector:@selector(decimalNumberByAdding:)]代码>
您的代码没有成功,因为它是一个结构,而不是一个对象;它不应该声明为指针,如果不是,您将无法添加它。这不是解决方案的正确途径。在数组中添加所有NSNumber
的简单方法是(类似于@Mahonor在评论中所说的):
与状态相反,数组中的数字不会转换为double
,而是转换为NSDecimal
。因此,在添加十进制数时,不会丢失精度。即使是非十进制数的NSNumber
对象也会转换为NSDecimal
进行加法。求和的结果是NSDecimalValue
的一个实例
我用两种不同的方式验证(或试图验证)。首先,我运行了这个代码
NSNumber *a = [NSNumber numberWithDouble:1.2];
NSNumber *b = [NSDecimalNumber decimalNumberWithString:@"-5.7"];
NSArray *myArray = @[a, b];
id sum = [myArray valueForKeyPath:@"@sum.self"];
并通过设置环境变量“NSObjCMessageLoggingEnabled=YES”激活Objective-C消息日志记录。从创建的“/tmp/msgSends NNNN”文件中可以看到,小数
(而不是双值
)被发送到两个数字对象
其次,我创建了一个自定义类,实现了小数值
和双值
,并将@sum.self
应用于自定义类的一个对象数组:
@interface MyClass : NSObject
@property (nonatomic, assign) double value;
@end
@implementation MyClass
- (NSDecimal)decimalValue
{
return [[NSNumber numberWithDouble:self.value] decimalValue];
}
- (double)doubleValue
{
return self.value;
}
@end
MyClass *a = [MyClass new]; a.value = 1.2;
MyClass *b = [MyClass new]; b.value = -5.7;
NSArray *myArray = @[a, b];
id sum = [myArray valueForKeyPath:@"@sum.self"];
通过在这两种方法中设置断点,可以看出只有十进制值
用于求和(如果类未实现十进制值
,则valueForKeyPath:@“@sum.self”
会引发异常)
您还可以看到,decimalValue
是从
-[NSArray(NSKeyValueCoding) _sumForKeyPath:]
此方法的汇编代码显示,NSDecimalAdd
用于添加数字。在数组中添加所有NSNumber
的简单方法是(类似于@Mahonor在评论中所说的):
与状态相反,数组中的数字不会转换为double
,而是转换为NSDecimal
。因此,在添加十进制数时,不会丢失精度。即使是非十进制数的NSNumber
对象也会转换为NSDecimal
进行加法。求和的结果是NSDecimalValue
的一个实例
我用两种不同的方式验证(或试图验证)。首先,我运行了这个代码
NSNumber *a = [NSNumber numberWithDouble:1.2];
NSNumber *b = [NSDecimalNumber decimalNumberWithString:@"-5.7"];
NSArray *myArray = @[a, b];
id sum = [myArray valueForKeyPath:@"@sum.self"];
并通过设置环境变量“NSObjCMessageLoggingEnabled=YES”激活Objective-C消息日志记录。从创建的“/tmp/msgSends NNNN”文件中可以看到,小数
(而不是双值
)被发送到两个数字对象
其次,我创建了一个自定义类,实现了小数值
和双值
,并将@sum.self
应用于自定义类的一个对象数组:
@interface MyClass : NSObject
@property (nonatomic, assign) double value;
@end
@implementation MyClass
- (NSDecimal)decimalValue
{
return [[NSNumber numberWithDouble:self.value] decimalValue];
}
- (double)doubleValue
{
return self.value;
}
@end
MyClass *a = [MyClass new]; a.value = 1.2;
MyClass *b = [MyClass new]; b.value = -5.7;
NSArray *myArray = @[a, b];
id sum = [myArray valueForKeyPath:@"@sum.self"];
通过在这两种方法中设置断点,可以看出只有十进制值
用于求和(如果类未实现十进制值
,则valueForKeyPath:@“@sum.self”
会引发异常)
您还可以看到,decimalValue
是从
-[NSArray(NSKeyValueCoding) _sumForKeyPath:]
此方法的汇编程序代码显示,NSDecimalAdd
用于添加数字。如果数组包含字典,则apple提供一行执行NSNumber*amountSum=[YourArray valueForKeyPath:@“@sum.amount”];NSLog(@“%@”,金额总和);有关更多信息,您可以通过此链接@Manohar:您也可以将KVC用于普通数组:[myArray valueForKeyPath:@“@sum.self”]
。如果您的数组包含字典,则apple提供单行执行NSNumber*amountSum=[YourArray valueForKeyPath:@“@sum.amount”];NSLog(@“%@”,金额总和);有关更多信息,请访问此链接@Manohar:您也可以将KVC用于普通数组:[myArray valueForKeyPath:@“@sum.self”]
。谢谢,这正是我需要的!Th