首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有一种方法可以在不使用NSNumber和创建自动释放对象的情况下创建NSDecimal?

有没有一种方法可以在不使用NSNumber和创建自动释放对象的情况下创建NSDecimal?
EN

Stack Overflow用户
提问于 2010-01-10 07:43:43
回答 1查看 15.6K关注 0票数 19

我使用NSDecimal执行了大量计算,并使用以下技术创建了每个NSDecimal结构:

代码语言:javascript
复制
[[NSNumber numberWithFloat:kFloatConstant] decimalValue]

我使用NSDecimal是为了避免使用自动释放的NSDecimalNumber对象(如果使用NSDecimalNumber方法进行精确计算)。但是,NSNumber创建机制似乎也会返回一个自动释放的NSNumber,从中提取出十进制值。

有没有一种方法可以在不使用NSNumber和创建自动释放对象的情况下创建NSDecimal

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-01-10 10:22:05

不幸的是,苹果没有提供任何简单的方法来将值放入NSDecimal结构中。结构定义本身可以在NSDecimal.h头文件中找到:

代码语言:javascript
复制
typedef struct {
    signed   int _exponent:8;
    unsigned int _length:4;     // length == 0 && isNegative -> NaN
    unsigned int _isNegative:1;
    unsigned int _isCompact:1;
    unsigned int _reserved:18;
    unsigned short _mantissa[NSDecimalMaxSize];
} NSDecimal;

但我不知道我是否会去尝试反向工程结构是如何保存值的。结构中字段上的下划线表示这些字段是私有的,可能会更改。我不认为在低级NSDecimal函数中会发生很多变化,但我会担心某些东西会在某一时刻崩溃。

鉴于此,从浮点数初始化NSDecimal最好按照您所描述的方式来完成。但是,请注意,任何时候使用浮点值都会失去使用NSDecimal获得的精度,并且会导致浮点错误。

我总是只在高精度计算中使用NSDecimals,并接收和导出NSStrings,以便与外部世界交换这些值。要基于NSString创建NSDecimal,可以使用我们在Core Plot framework中采用的方法

代码语言:javascript
复制
NSDecimal CPDecimalFromString(NSString *stringRepresentation)
{
    NSDecimal result;
    NSScanner *theScanner = [[NSScanner alloc] initWithString:stringRepresentation];
    [theScanner scanDecimal:&result];
    [theScanner release];

    return result;
}

在我的测试中,使用NSScanner而不是NSDecimalNumber -initWithString:locale:大约快了90%。

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2035421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档