Как добавить два объекта 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