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