gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 08:14:46 25 4
gpt4 key购买 nike

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

[[NSNumber numberWithFloat:kFloatConstant] decimalValue]

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

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

最佳答案

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

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;

但我不知道我会四处尝试对结构如何保存值进行逆向工程。结构中字段上的下划线表示这些字段是私有(private)的并且可能会发生变化。我不认为低级 NSDecimal 函数会发生很多变化,但我会担心某些时候出现问题。

鉴于此,最好按照您描述的方式从 float 初始化 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%。

关于ios - 有没有办法在不使用 NSNumber 和创建自动释放对象的情况下创建 NSDecimal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2035421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com