Ios 有没有一种方法可以在不使用NSNumber和创建自动删除对象的情况下创建NSDecimal?

Ios 有没有一种方法可以在不使用NSNumber和创建自动删除对象的情况下创建NSDecimal?,ios,objective-c,autorelease,Ios,Objective C,Autorelease,我正在使用NSDecimal进行大量计算,并使用以下技术创建每个NSDecimal结构: [[NSNumber numberWithFloat:kFloatConstant] decimalValue] 我使用NSDecimalNumber来避免使用自动删除的NSDecimalNumber对象(如果使用了精确计算的NSDecimalNumber方法)。但是,NSNumber创建机制似乎也会返回一个自动删除的NSNumber,从中提取十进制值 有没有一种方法可以创建一个NSDecimal,而不使

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

[[NSNumber numberWithFloat:kFloatConstant] decimalValue]
我使用
NSDecimalNumber
来避免使用自动删除的
NSDecimalNumber
对象(如果使用了精确计算的
NSDecimalNumber
方法)。但是,
NSNumber
创建机制似乎也会返回一个自动删除的
NSNumber
,从中提取十进制值


有没有一种方法可以创建一个
NSDecimal
,而不使用NSNumber并创建自动删除的对象

不幸的是,苹果没有提供任何将值放入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,并接收和导出nsstring,以便与外部世界交换这些值。要基于NSString创建NSDecimal,您可以使用以下方法:

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

要回答“无自动删除对象”部分,只需:

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

NSDecimal类之所以被误解,是因为它太违反直觉了。为什么苹果让它变得如此不利于程序员?NSDecimal的替代方案是什么?@AndrewS-首先,NSDecimal不是一个类,而是一个结构,因此它的处理方式需要与标准对象稍有不同。NSDecimal处理函数的复杂性似乎源于希望使它们尽可能快。请注意,它们通过引用传递到这些函数中,作为一种优化。不过,没有理由不为NSDecimal提供一个简单的构造函数。有没有像NSInteger这样更原始的十进制数?@AndrewS-没有。像
float
double
这样的浮点标量不会以这样的格式存储它们的值来执行NSDecimal那样的10进制算术。除非一个是以字符串开头,我会避免在将一个数字类型(
float
)转换为另一个(
NSDecimal
)时通过sting进行往返。这里的问题不是自动删除对象,而是避免从一开始就分配它。NSDecimalNumber的任何分配(自动删除或否)都将比处理NSDecimal结构慢:。在创建和销毁这些对象的过程中会有很大的开销。您还假设它们是以浮点值开始的,希望在处理NSDecimals和NSDecimalNumbers时不会是这种情况。此外,您可能不想使用-initWithFloat:原因如下:@BradLarson这就是为什么我在回答之前加上“回答‘没有自动删除对象’部分”@BradLarson问题中的
initWithFloat:
numberWithFloat:
kFloatConstant
匹配。“很明显,OP开始时没有什么比浮点数更准确了。”布拉德拉尔森仔细阅读了不准确的问题;在我看来,这就像NSNumber/NSDecimalNumber实现中的一个bug。正如我上面所说的,如果准确度对您很重要,请不要使用NSDecimal/NSDecimalNumber。似乎
NSDecimal
是为具有特定精度范围的事物而设计的,其中准确度很重要,例如货币,由于精度损失的风险,您不希望将其转换为或转换为
浮点
双精度
。你能告诉我们更多关于你的用例吗?
NSDecimalNumber *intermediateNumber = [[NSDecimalNumber alloc] initWithFloat:kFloatConstant];
NSDecimal decimal = [intermediateNumber decimalValue];
[intermediateNumber release];