objective-c - logo - objective c vs c++
Valor absoluto(abs) de NSDecimalNumber sin pérdida de precisión (4)
Hay un pequeño error en la respuesta: negativeOne debe ser un puntero. Aquí hay una respuesta revisada:
- (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;
}
}
Y aquí hay una versión adecuada para ser usada como una categoría en 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;
}
}
Necesito obtener el valor absoluto de un NSDecimalNumber sin pérdida de precisión. Parece que no puedo encontrar una manera de hacer esto sin convertir a decimal o float (con una pérdida de precisión). ¿Hay un método para hacer esto?
Puede usar las funciones integradas de la clase NSDecimalNumber para comparar el número a cero y luego multiplicar por -1 según corresponda. Por ejemplo:
- (NSDecimalNumber *)abs:(NSDecimalNumber *)num {
if ([num 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;
}
}
Dado que este método funciona únicamente con NSDecimalNumbers, no hay pérdida de precisión.
Si no quiere multiplicarlo, la resta cero del valor hará el truco.
- (NSDecimalNumber *)abs:(NSDecimalNumber *)num {
if ([num compare:[NSDecimalNumber zero]] == NSOrderedAscending) {
// negative value
return [[NSDecimalNumber zero] decimalNumberBySubtracting:num];
} else {
return num;
}
}
Variante Swift 4.0:
extension NSDecimalNumber {
func absoluteValue() -> NSDecimalNumber {
if self.compare(NSDecimalNumber.zero) == .orderedAscending {
let negativeValue = NSDecimalNumber(mantissa: 1, exponent: 0, isNegative: true)
return self.multiplying(by: negativeValue)
} else {
return self
}
}
}
uso
let sum = NSDecimalNumber(value: -123.33)
sum.absoluteValue()