有没有办法创build一个NSDecimal而不使用NSNumber和创build自动释放对象?

我正在使用NSDecimal进行一些计算,并使用以下技术创build每个NSDecimal结构:

 [[NSNumber numberWithFloat:kFloatConstant] decimalValue] 

我正在使用NSDecimal来避免使用自动释放的NSDecimalNumber对象(如果使用NSDecimalNumber方法来精确计算)。 但是,似乎NSNumber创build机制也返回提取十进制值的自动释放的NSNumber

有没有办法创build一个NSDecimal而不使用NSNumber和创build自动释放对象?

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

 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,以便与外界交换这些值。 要创build基于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 -initWithString:locale:在我的基准testing中快了大约90%。

要回答“没有自动释放对象”的部分,简单地说:

 NSDecimalNumber *intermediateNumber = [[NSDecimalNumber alloc] initWithFloat:kFloatConstant]; NSDecimal decimal = [intermediateNumber decimalValue]; [intermediateNumber release];