Как добавить два объекта NSNumber?

Теперь это должно быть легко, но как можно суммировать два NSNumber? Вот как:

[one floatValue] + [two floatValue]

или существует лучший способ?

Ответ 1

На самом деле нет лучшего способа, но вы действительно не должны этого делать, если сможете избежать этого. NSNumber существует как оболочка для скалярных чисел, поэтому вы можете хранить их в коллекциях и передавать их полиморфно с другими NSObjects. На самом деле они не используются для хранения чисел в реальной математике. Если вы делаете математику на них, это намного медленнее, чем выполнение операции только на скалярах, поэтому, вероятно, для этого нет удобных методов.

Например:

NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];

Выполняет как минимум 21 инструкцию по отправке сообщений, и сколько бы кода кода не выполнялось, чтобы распаковать и переустановить значения (возможно, несколько сотен), чтобы выполнить математическую оценку в 1 инструкцию.

Итак, если вам нужно хранить числа в dicts, используйте NSNumber, если вам нужно передать что-то, что может быть числом или строкой, в функцию, использующую NSNumber, но если вы просто хотите сделать математическую палочку с скалярные типы C.

Ответ 2

NSDecimalNumber (подкласс NSNumber) содержит все полезные свойства, которые вы ищете:

– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:

...

Если вычислительная производительность представляет интерес, то преобразуется в массив С++ std::vector или как.

Теперь я больше никогда не использую C-массивы; Слишком легко сбой при неправильном указателе или указателе. И очень утомительно спарить каждый новый [] с помощью delete [].

Ответ 3

Вы можете использовать

NSNumber *sum = @([first integerValue] + [second integerValue]);

Изменить: Как заметил ohho, этот пример предназначен для добавления двух экземпляров NSNumber, содержащих целые значения. Если вы хотите добавить два NSNumber, которые содержат значения с плавающей запятой, вы должны сделать следующее:

NSNumber *sum = @([first floatValue] + [second floatValue]);

Ответ 4

В текущем голосовании с высоким рейтингом будет происходить сложная диагностика ошибок и потеря точности из-за использования поплавков. Если вы выполняете числовые операции над значениями NSNumber, сначала необходимо преобразовать в NSDecimalNumber и выполнить операции с этими объектами.

Из документация:

NSDecimalNumber, неизменяемый подкласс NSNumber, предоставляет объектно-ориентированную оболочку для выполнения арифметики base-10. Экземпляр может представлять любое число, которое может быть выражено как показатель mantissa x 10 ^, где мантисса - это десятичное целое число до 38 цифр, а показатель - целое число от -128 до 127.

Следовательно, вы должны преобразовать свои экземпляры NSNumber в NSDecimalNumbers с помощью [NSNumber decimalValue], выполнить любую арифметику, которую хотите, а затем назначить обратно NSNumber, когда вы закончите.

В Objective-C:

NSDecimalNumber *a = [NSDecimalNumber decimalNumberWithDecimal:one.decimalValue]
NSDecimalNumber *b = [NSDecimalNumber decimalNumberWithDecimal:two.decimalValue]
NSNumber *result = [a decimalNumberByAdding:b]

В Swift 3:

let a = NSDecimalNumber(decimal: one.decimalValue)
let b = NSDecimalNumber(decimal: two.decimalValue)
let result: NSNumber = a.adding(b)

Ответ 5

В Swift вы можете получить эту функциональность, используя библиотеку Bolt_Swift https://github.com/williamFalcon/Bolt_Swift.

Пример:

  var num1 = NSNumber(integer: 20)
  var num2 = NSNumber(integer: 25)
  print(num1+num2) //prints 45