将NSDecimal设置为零

时间:2013-04-23 09:28:25

标签: ios objective-c nsdecimalnumber nsdecimal

NSDecimal设置为零的不同方法有哪些?我不喜欢到目前为止发现的3个中的任何一个。

NSDecimal zero = {0}; // Not obvious what's going on here.

NSDecimal zero = @(0).decimalValue; // @(0) appears to always return the same instance.

NSDecimal zero = [NSDecimalNumber zero].decimalValue; // [NSDecimalNumber zero] appears to always return the same instance.

有没有比其他人更受欢迎的?我错过了某种NSDecimalZero常量/函数吗?

3 个答案:

答案 0 :(得分:4)

我从未注意到NSDecimal没有很好的Create功能。

我无法想象除了你列出的3之外的另一种方法。

NSDecimal zero = {0};

你是对的,这并不明显,这实际上是非常明显的。通常的程序员不会查找文档来查看结构将表示的所有属性设置为零的值。

NSDecimal zero = @(0).decimalValue

我不喜欢它,因为它使用NSNumber并且不必要地创建了一个自动释放的对象。

NSDecimal zero = [NSDecimalNumber zero].decimalValue

这是我的首选解决方案。直接使用NSDecimal结构主要是为了提升性能(不在堆上创建对象)。此方法与intent相匹配,因为它使用单例常量。

但是,如果你有很多涉及NSDecimal的代码并且性能对你来说非常重要,那么创建你自己的函数/宏来初始化struct并在任何地方使用这个函数。那么这个问题对您来说无关紧要,因为函数名称会使代码变得明显。

答案 1 :(得分:2)

NSDecimal是一个你不应该看到的C结构(你可以,但你不应该这样),以便排除第一个在技术上看结构内部的结构。

后两者中的任何一个都绝对没问题。请注意,在C中,分配给struct会复制所有字段,因此尽管[NSDecimalNumber为零]始终返回相同的对象,但NSDecimal将是一个唯一的结构,更改其内容不会影响任何已创建的其他NSDecimal “以同样的方式。

答案 2 :(得分:0)

我猜你需要使用NSDecimalNumber,

通常我们这样做:

NSDecimalNumber *zeroDecimal = [[NSDecimalNumber alloc] initWithFloat:0.f];
  

NSDecimal zero = @(0).decimalValue; // @(0)似乎总是返回   相同的实例。

     

NSDecimal zero = [NSDecimalNumber zero] .decimalValue; //   [NSDecimalNumber zero]似乎总是返回相同的实例。

以上两个返回等效值0.0,第一个只是第二个的简写符号。您使用新语法将0加到NSDecimalNumber。


但是,NSDecimal是typedefStruct,看起来像这样

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;