3

我正在寻找一种有效的方法来保存缓冲区NSDecimalNumber中的其他数据。NSData

我还没有找到直接从NSDecimalNumber. 但是,很容易将其转换为:

NSDecimal value = [theDecimalNumber decimalValue];

NSDecimal并且在内存中传输(20字节)并不困难。

但是,我的问题是:NSDecimalNumberNSDecimal是否完全相同?

因为他们的声明有一些不同(ExternalRefCount?):

@interface NSDecimalNumber : NSNumber {
@private
    signed   int _exponent:8;
    unsigned int _length:4;
    unsigned int _isNegative:1;
    unsigned int _isCompact:1;
    unsigned int _reserved:1;
    unsigned int _hasExternalRefCount:1;
    unsigned int _refs:16;
    unsigned short _mantissa[0]; /* GCC */
}

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;

是否可以在这两种类型之间执行多次传输,而不会损失任何精度?

4

2 回答 2

0

我做了很多计算,从一个转移到另一个,没有任何问题。所以我认为我们可以说它们是相同的。

我扩展NSDecimalNumber

#define DecNum_SizeOf   20

+ (NSDecimalNumber *) fromPtr:(void *)ptr
{
    NSDecimal valueRead;
    memcpy (&valueRead, ptr, DecNum_SizeOf);
    return [NSDecimalNumber decimalNumberWithDecimal:valueRead];
}

- (void) toPtr:(void *)ptr
{
    NSDecimal valueWrite = [self decimalValue];
    memcpy (ptr, &valueWrite, DecNum_SizeOf);
}

在等待更“标准”的方法来执行工作的同时

于 2014-12-05T18:29:56.917 回答
0

您是否尝试使用NSArchiver类方法?

NSData *data=[NSArchiver archivedDataWithRootObject:yourNumber];
于 2014-11-27T11:11:56.517 回答