将 NSDecimalNumber 变为负数

Posted

技术标签:

【中文标题】将 NSDecimalNumber 变为负数【英文标题】:Turn a NSDecimalNumber negative 【发布时间】:2011-02-20 15:26:56 【问题描述】:

我正在寻找一种方法,通过乘以 -1NSDecimalNumber 变为负数。

/* decNumber is the one I would like to turn negative */
NSDecimalNumber *decNumber = [values objectAtIndex:billIndex];

NSDecimalNumber *minusOne = [[NSDecimalNumber alloc] initWithInt: -1];
finalValue = [[NSDecimalNumber alloc] initWithDecimal: [[decNumber decimalNumberByMultiplyingBy: minusOne] decimalValue]];

这行得通,但感觉对于这样一个简单的逻辑来说太过分了。你能想出更好的方法来实现这一点吗?

【问题讨论】:

【参考方案1】:

您可以使用NSDecimalNumber>>decimalNumberWithMantissa:exponent:isNegative 更简洁地生成-1。

/* Answers (aDecimal x -1) */
NSDecimalNumber* negate(NSDecimalNumber *aDecimal) 
    return [aDecimal decimalNumberByMultiplyingBy:
                    [NSDecimalNumber decimalNumberWithMantissa: 1
                                                      exponent: 0
                                                    isNegative: YES]];

【讨论】:

为什么不直接使用[NSDecimalNumber decimalNumberWithString:@"-1"] @MattDiPasquale - 这也可以。它可能效率不高,但是像临时对象一样创建新对象无论如何也不是那么有效。 @DShawley,非常感谢。我认为使用 string 方法更具可读性。但是,我认为方法的名称 negate 无论如何都清楚,所以我会采用您的解决方案以提高效率。谢谢! :) 不管怎样,我喜欢 Matt 的 decimalNumberWithString。它确实更容易阅读。它可能效率较低,但我喜欢易于阅读的东西。【参考方案2】:

与 D.Shawley 的回答类似,但具有扩展性和快速风格。

extension NSDecimalNumber 
    /* Answers (aDecimal x -1) */
    func decimalNumberByNegating() -> NSDecimalNumber 
        return self.decimalNumberByMultiplyingBy(NSDecimalNumber(mantissa: 1, exponent: 0, isNegative: true));
    

【讨论】:

【参考方案3】:

使用网桥as

extension NSDecimalNumber 

    func decimalNumberByNegating() -> NSDecimalNumber 
        return -(self as Decimal) as NSDecimalNumber
    

【讨论】:

以上是关于将 NSDecimalNumber 变为负数的主要内容,如果未能解决你的问题,请参考以下文章

NSDecimalNumber用于精度准确的计算

将 NSDecimalNumbers 转换为负数

Unity Timer 变为负数?

如果 NSDecimalNumber 大于 Uint64,如何将 NSDecimalNumber 转换为字节数组?

如何防止整数值变为负数

Unity - frameCount 何时变为负数