不幸的是,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%。