Теперь это должно быть легко, но как можно суммировать два NSNumber
? Вот как:
[one floatValue] + [two floatValue]
или существует лучший способ?
Теперь это должно быть легко, но как можно суммировать два NSNumber
? Вот как:
[one floatValue] + [two floatValue]
или существует лучший способ?
На самом деле нет лучшего способа, но вы действительно не должны этого делать, если сможете избежать этого. NSNumber
существует как оболочка для скалярных чисел, поэтому вы можете хранить их в коллекциях и передавать их полиморфно с другими NSObjects
. На самом деле они не используются для хранения чисел в реальной математике. Если вы делаете математику на них, это намного медленнее, чем выполнение операции только на скалярах, поэтому, вероятно, для этого нет удобных методов.
Например:
NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];
Выполняет как минимум 21 инструкцию по отправке сообщений, и сколько бы кода кода не выполнялось, чтобы распаковать и переустановить значения (возможно, несколько сотен), чтобы выполнить математическую оценку в 1 инструкцию.
Итак, если вам нужно хранить числа в dicts, используйте NSNumber
, если вам нужно передать что-то, что может быть числом или строкой, в функцию, использующую NSNumber
, но если вы просто хотите сделать математическую палочку с скалярные типы C.
NSDecimalNumber (подкласс NSNumber) содержит все полезные свойства, которые вы ищете:
– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:
...
Если вычислительная производительность представляет интерес, то преобразуется в массив С++ std::vector или как.
Теперь я больше никогда не использую C-массивы; Слишком легко сбой при неправильном указателе или указателе. И очень утомительно спарить каждый новый [] с помощью delete [].
Вы можете использовать
NSNumber *sum = @([first integerValue] + [second integerValue]);
Изменить:
Как заметил ohho, этот пример предназначен для добавления двух экземпляров NSNumber
, содержащих целые значения. Если вы хотите добавить два NSNumber
, которые содержат значения с плавающей запятой, вы должны сделать следующее:
NSNumber *sum = @([first floatValue] + [second floatValue]);
В текущем голосовании с высоким рейтингом будет происходить сложная диагностика ошибок и потеря точности из-за использования поплавков. Если вы выполняете числовые операции над значениями 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)
В Swift вы можете получить эту функциональность, используя библиотеку Bolt_Swift https://github.com/williamFalcon/Bolt_Swift.
Пример:
var num1 = NSNumber(integer: 20)
var num2 = NSNumber(integer: 25)
print(num1+num2) //prints 45