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