tutorial objective logo example español objective-c

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()