Objective c 无精度损失的NSDecimalNumber绝对值(abs)

Objective c 无精度损失的NSDecimalNumber绝对值(abs),objective-c,Objective C,我需要在不损失精度的情况下得到一个小数的绝对值。我似乎找不到一种不转换为十进制或浮点(精度损失)的方法来实现这一点。有没有办法做到这一点?您可以使用NSDecimalNumber类的内置函数将数字与零进行比较,然后根据需要乘以-1。例如: -(NSDecimalNumber*)abs:(NSDecimalNumber*)num{ if([num compare:[NSDecimalNumber zero]]==nsoredascensing){ //数字是负数,乘以-1 NSDecimalNum

我需要在不损失精度的情况下得到一个小数的绝对值。我似乎找不到一种不转换为十进制或浮点(精度损失)的方法来实现这一点。有没有办法做到这一点?

您可以使用NSDecimalNumber类的内置函数将数字与零进行比较,然后根据需要乘以-1。例如:

-(NSDecimalNumber*)abs:(NSDecimalNumber*)num{
if([num compare:[NSDecimalNumber zero]]==nsoredascensing){
//数字是负数,乘以-1
NSDecimalNumber*negativeOne=[NSDecimalNumber DecimalNumberWith尾数:1
指数:0
[否:是];
返回[num decimalNumberByMultiplyingBy:negativeOne];
}否则{
返回num;
}
}


由于此方法仅适用于NSDEcimalNumber,因此不会损失精度。

答案中有一个小错误:negativeOne应该是指针。以下是修改后的答案:

- (NSDecimalNumber *)abs:(NSDecimalNumber *)num {
    if [myNumber compare:[NSDecimalNumber zero]] == NSOrderedAscending) {
        // Number is negative. Multiply by -1
        NSDecimalNumber *negativeOne = [NSDecimalNumber decimalNumberWithMantissa:1
                                                                    exponent:0
                                                                  isNegative:YES];
        return [num decimalNumberByMultiplyingBy:negativeOne];
    } else {
        return num;
    }
}
以下是一个适合用作NSDecimalNumber类别的版本:

- (NSDecimalNumber *)abs {
    if ([self compare:[NSDecimalNumber zero]] == NSOrderedAscending) {
        // Number is negative. Multiply by -1
        NSDecimalNumber *negativeOne = [NSDecimalNumber decimalNumberWithMantissa:1
                                                                         exponent:0
                                                                       isNegative:YES];
        return [self decimalNumberByMultiplyingBy:negativeOne];
    } else {
        return self;
    }
}

如果您不想将其相乘,则用零减去该值即可

- (NSDecimalNumber *)abs:(NSDecimalNumber *)num {
    if ([num compare:[NSDecimalNumber zero]] == NSOrderedAscending) {
        // negative value
        return [[NSDecimalNumber zero] decimalNumberBySubtracting:num];
    } else {
        return num;
    }
}
Swift 4.0版本:

扩展名NSDecimalNumber{
func absoluteValue()->NSDecimalNumber{
如果self.compare(NSDecimalNumber.zero)=.orderedAscending{
设negativeValue=NSDecimalNumber(尾数:1,指数:0,isNegative:true)
返回自乘(乘:negativeValue)
}否则{
回归自我
}
}
}
用法

let sum=NSDecimalNumber(值:-123.33)
sum.absoluteValue()
Swift 5 您可以使用
十进制
幅值
属性:

extension NSDecimalNumber {
    var absValue: Self {
        .init(decimal: decimalValue.magnitude)
    }
}

把它和零比较,如果它更小,就把它乘以-1,否则就用它。我知道一定有一些简单的东西我遗漏了。谢谢。更新了我的答案以反映指针,并感谢实例实现!谢谢你的分类片段!
extension NSDecimalNumber {
    var absValue: Self {
        .init(decimal: decimalValue.magnitude)
    }
}
let number = NSDecimalNumber(string: "-123.456")
let absNumber = number.absValue // 123.456