cha*_*lax 28 iphone cocoa objective-c key-value-coding
我已经阅读了很多关于NSDecimal,NSNumber,NSNumberDecimal,CFNumber ......它开始对我来说是一种丛林.
基本上,我正在尝试创建一个简单的模型类来处理简单的计算,如下所示:
#import <Foundation/Foundation.h>
@interface Test : NSObject
{
float rate;
float amount;
int duration;
}
- (float)capitalizedAmount;
@end
@implementation Test
- (float)capitalizedAmount {
return (amount*pow((1.0+rate),duration));
}
@end
Run Code Online (Sandbox Code Playgroud)
我想以名字作为字符串来访问这些方法和setter,因为我打算有很多其他类这样的类,我只保留一个字段列表来进行键值编码.
// This is just the desired behavior
// This evidently won't work with the previous class definition
Test *obj = [[Test alloc] init];
[NSNumber numberWithInt:10]
...
float r;
r = [obj performSelector:NSSelectorFromString(@"capitalizedAmount")];
Run Code Online (Sandbox Code Playgroud)
我知道这是不可能的,performSelector:它将返回一个对象,因此它capitalizedAmount应该返回一个对象.我已经阅读NSInvocation了关于comp.lang的Objective-C Faq的相关内容和相关部分.
我也明白我应该使用NSDecimalNumber,但我想知道两件事:
decimalNumberByAdding:吗?使用Python,很容易定义__add__使用运算符和对象.我应该从中获取浮点值NSDecimalNumber,然后进行计算并返回包含在NSDecimalNumber?中的结果?你会如何处理这个问题?我正在寻找一个简单而美观的解决方案!
在同一领域的另一个问题是:iPhone Core Foundation上CFBoolean的对象包装器BOOL?
非常感谢您的帮助!
Ole*_*ann 26
如果您正在处理财务计算,那么您真的应该使用base-10算法来避免标准base-2浮点类型可能出现的舍入错误.所以它是NSDecimal或NSDecimalNumber.由于您正在编写面向对象的代码,因此NSDecimalNumber是您的正确选择.
回答您的问题:只测试您的代码可以揭示内存开销和性能损失是否可以接受.我并没有真正使用NSDecimalNumber,但我敢打赌Apple的实施非常有效,并且足以满足大多数人的需求.
不幸的是,你将无法避免decimalNumberByAdding:类似的问题,因为Objective-C不像C++那样支持运算符重载.我同意它会使你的代码不那么优雅.
关于你发布的代码的一个评论:r = [obj performSelector:NSSelectorFromString(@"capitalizedAmount")];相当不优雅.或
r = [obj performSelector:@selector(capitalizedAmount)];
Run Code Online (Sandbox Code Playgroud)
甚至简单
r = [obj capitalizedAmount];
Run Code Online (Sandbox Code Playgroud)
会更好,除非您NSSelectorFromString因某些其他原因需要语法.
Bra*_*son 19
Ole是正确的,因为您应该使用NSDecimal或NSDecimalNumber来避免在进行财务计算时出现浮点数学错误.但是,我的建议是使用NSDecimal及其C函数,而不是NSDecimalNumber.NSDecimal计算可以更快,因为它们避免创建大量自动释放的对象,在内存使用方面要好得多.
作为一个例子,我在MacBook Air上对这两种类型的数学运算进行了基准测试:
NSDecimal
Additions per second: 3355476.75
Subtractions per second: 3866671.27
Multiplications per second: 3458770.51
Divisions per second: 276242.32
NSDecimalNumber
Additions per second: 676901.32
Subtractions per second: 671474.6
Multiplications per second: 720310.63
Divisions per second: 190249.33
Run Code Online (Sandbox Code Playgroud)
在使用NSDecimal与NSDecimalNumber时,除法是唯一没有经历大约五倍性能提升的操作.iPhone上也有类似的性能改进.这与内存节省一样,是我们最近将Core Plot转换为使用NSDecimal的原因.
您遇到的唯一困难是将值输入和输出NSDecimal类型.直接进出float和integer值可能需要使用NSDecimalNumber作为桥.此外,如果您使用Core Data,您将把值存储为NSDecimalNumbers,而不是NSDecimals.
| 归档时间: |
|
| 查看次数: |
13367 次 |
| 最近记录: |