2015-05-27 5 views
-1

Я использую этот код, чтобы инвертировать NSDecimalNumber для упрощения арифметики:Отрицание в NSDecimalNumber без потери дробной части

self.thisTransaction.amount = [NSDecimalNumber decimalNumberWithString:self.amountField.text locale:NSLocale.currentLocale]; 

    NSLog(@"1 thisTransaction.amount is %@",self.thisTransaction.amount); 

    // Inverts the transaction amount 

    // This code negates the number, but chops off the part on the right side of the decimal 

    self.thisTransaction.amount = [NSDecimalNumber decimalNumberWithMantissa:[self.thisTransaction.amount longLongValue] exponent:0 isNegative:YES]; 

    NSLog(@"2 thisTransaction.amount is %@",self.thisTransaction.amount); 

Ну, я думал, что арифметическое будет проще, во всяком случае. Однако, как показано в консоли считывании ниже, код сводит на нет числа, но отсекает число в десятичной точке и возвращает целое число вместо десятичного:

2015-05-27 10:07:30.767 XXXXX[11835:10266658] 1 thisTransaction.amount is 25.49 
2015-05-27 10:07:39.735 XXXXX[11835:10266658] 2 thisTransaction.amount is -25 

Я посмотрел на довольно много сообщений на SO, но они, похоже, кружатся по кругу. Я бы очень признателен за некоторые рекомендации.

EDIT:

В соответствии с @ rmaddy-й предложением ниже, я изменил код следующим образом:

self.thisTransaction.amount = [NSDecimalNumber decimalNumberWithString:self.amountField.text locale:NSLocale.currentLocale]; 

    NSLog(@"1 thisTransaction.amount is %@",self.thisTransaction.amount); 

    // Inverts the transaction amount 

    NSDecimalNumber * invertedMultiplier = [NSDecimalNumber decimalNumberWithString:@"-1"]; 

    self.thisTransaction.amount = [self.thisTransaction.amount decimalNumberByMultiplyingBy:invertedMultiplier]; 



    NSLog(@"2 thisTransaction.amount is %@",self.thisTransaction.amount); 

Это, кажется, работает хорошо.

+0

Спасибо, и смотрите редактирование выше. – rattletrap99

+0

Принятый ответ был изменен после того, как я сделал редактирование. И на самом деле, я использовал несколько иной подход, чем измененный ответ. Очевидно, обе стратегии будут работать, но исправление было явно предложено оригинальным ответом @ rmaddy. Благодаря! – rattletrap99

ответ

3

Если вы хотите, чтобы свести на нет в NSDecimalNumber вы можете просто сделать:

NSDecimalNumber *originalNumber = ... // the original decimal number 

NSDecimalNumber *negatedNumber = [originalNumber decimalNumberByMultiplyingBy:[NSDecimalNumber numberWithInt:-1]]; 

И для удовольствия, вот еще один способ:

NSDecimalNumber *anotherNegate = [[NSDecimalNumber zero] decimalNumberBySubtracting:originalNumber]; 
+0

Это почти сработало, но мне пришлось перефразировать его, как показано в приведенном выше правиле. Благодаря! – rattletrap99

+0

Упс. Исправлено использование '-1'. – rmaddy

+0

Я наткнулся на альтернативное исправление, как показано выше. Но ваш взгляд более эффективен. – rattletrap99

 Смежные вопросы

  • Нет связанных вопросов^_^