19

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

[[NSNumber numberWithFloat:kFloatConstant] decimalValue]

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

有没有办法在NSDecimal不使用 NSNumber 和创建自动释放对象的情况下创建一个?

4

2 回答 2

28

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

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 框架中采用的方法:

NSDecimal CPDecimalFromString(NSString *stringRepresentation)
{
    NSDecimal result;
    NSScanner *theScanner = [[NSScanner alloc] initWithString:stringRepresentation];
    [theScanner scanDecimal:&result];
    [theScanner release];

    return result;
}

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

于 2010-01-10T02:22:05.147 回答
2
于 2013-06-13T22:37:08.240 回答