我使用NSDecimal
执行了大量计算,并使用以下技术创建了每个NSDecimal
结构:
[[NSNumber numberWithFloat:kFloatConstant] decimalValue]
我使用NSDecimal
是为了避免使用自动释放的NSDecimalNumber
对象(如果使用NSDecimalNumber
方法进行精确计算)。但是,NSNumber
创建机制似乎也会返回一个自动释放的NSNumber
,从中提取出十进制值。
有没有一种方法可以在不使用NSNumber和创建自动释放对象的情况下创建NSDecimal
?
发布于 2010-01-10 10:22:05
不幸的是,苹果没有提供任何简单的方法来将值放入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 framework中采用的方法
NSDecimal CPDecimalFromString(NSString *stringRepresentation)
{
NSDecimal result;
NSScanner *theScanner = [[NSScanner alloc] initWithString:stringRepresentation];
[theScanner scanDecimal:&result];
[theScanner release];
return result;
}
在我的测试中,使用NSScanner而不是NSDecimalNumber -initWithString:locale:
大约快了90%。
https://stackoverflow.com/questions/2035421
复制相似问题