- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经阅读了很多有关 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
我想以字符串形式访问这些方法和 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")];
我知道这是不可能的,performSelector:
将返回一个对象,因此 capitalizedAmount
应该返回一个对象。我已经阅读了有关 NSInvocation
的内容以及 comp.lang 上的 Objective-C Faq 中的相关部分。
我也知道我应该使用 NSDecimalNumber
,但是我想知道两件事:
decimalNumberByAdding:
这样的函数是不是太挑剔和复杂了?使用 Python 很容易定义 __add__
以对对象使用运算符。我是否应该从 NSDecimalNumber
获取浮点值,然后进行计算并返回包含在 NSDecimalNumber
中的结果?你会如何处理这个问题?我正在寻找一个简单而漂亮的解决方案!
同一领域的另一个问题:CFBoolean
是 iPhone Core Foundation 上 BOOL
的对象包装器吗?
非常感谢您的帮助!
最佳答案
如果您正在处理财务计算,您确实应该使用以 10 为基数的算法来避免标准以 2 为基数的浮点类型可能出现的舍入错误。所以它要么是 NSDecimal,要么是 NSDecimalNumber。由于您正在编写面向对象的代码,NSDecimalNumber 是您的正确选择。
回答你的问题:只有测试你的代码才能揭示你是否可以接受内存开销和性能损失。我并没有真正使用 NSDecimalNumber,但我敢打赌 Apple 的实现非常高效,足以满足大多数人的需求。
不幸的是,您将无法避免 decimalNumberByAdding:
之类的操作,因为 Objective-C 不像 C++ 那样支持运算符重载。我同意这会使您的代码不那么优雅。
对您发布的代码的评论:r = [obj performSelector:NSSelectorFromString(@"capitalizedAmount")];
相当不雅。要么
r = [obj performSelector:@selector(capitalizedAmount)];
甚至是简单的
r = [obj capitalizedAmount];
会更好,除非您出于某些其他原因需要 NSSelectorFromString
语法。
关于iphone - NSDecimal、NSDecimalNumber、CFNumber 之间的正确选择是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1704504/
很确定这个答案是否定的,但我不得不问这个问题已经够痛苦了:是否有一个 CFNumber 等同于 CFString 的 CFSTR 宏?为了避免这种事情: char one = 1; CFNumberR
我已经阅读了很多有关 NSDecimal、NSNumber、NSNumberDecimal、CFNumber 的内容……对我来说它开始成为一种丛林。 基本上,我正在尝试创建一个简单的模型类来处理简单的
每次我在我的应用程序中触发某个 segue 时,我都会收到 EXC_BAD_ACCESS 错误。多亏了这两个链接,我了解到启用 NSZombies 后可以更轻松地解决 EXC_BAD_ACCESS 问
当我从 History Core Data 对象记录/请求值时,下面的代码返回以下错误: -[CFNumber release]: message sent to deallocated instan
我正在使用 NSJSONSerialzation 解析 JSON 字符串,然后将其转换为 NSDictionary 以处理键值对。 JSON 字符串中的一些值由服务器作为整数发送,但是,NSDicti
实现将原始数字的 C 数组包装到 CFNumbers 的 CFArray 中的方法的最佳方法是什么? 我想这样调用: double values[] = {1.2345, 678.9}; CFArra
我是一名优秀的程序员,十分优秀!