Program Tip

두 개의 NSNumber 객체를 추가하는 방법은 무엇입니까?

programtip 2020. 10. 13. 19:03
반응형

두 개의 NSNumber 객체를 추가하는 방법은 무엇입니까?


이제 이것은 쉬울 것입니다. 그러나 어떻게 2를 합할 수 NSNumber있습니까? 처럼:

[one floatValue] + [two floatValue]

아니면 더 나은 방법이 있습니까?


정말 더 좋은 방법은 없지만 피할 수 있다면 정말 그렇게해서는 안됩니다. NSNumber스칼라 숫자에 대한 래퍼로 존재하므로 컬렉션에 저장하고 다른 NSObjects. 그들은 실제 수학에서 숫자를 저장하는 데 실제로 사용되지 않습니다. 그들에 대해 수학을한다면 스칼라에 대해서만 연산을 수행하는 것보다 훨씬 느리기 때문에 아마도 그것에 대한 편리한 방법이 없을 것입니다.

예를 들면 :

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

메시지 디스패치에 대해 최소 21 개의 명령어를 불고 있으며, 1 개의 명령어 가치의 수학을 수행하기 위해 메소드가 값 (아마도 수백 개)을 unboxing하고 rebox하는 데 얼마나 많은 코드가 필요합니다.

따라서 딕셔너리에 숫자를 저장해야하는 경우를 사용하고 NSNumber, 숫자 나 문자열이 될 수있는 것을 함수에 전달해야하는 경우를 사용하십시오 NSNumber.하지만 스칼라 C 유형으로 수학 스틱을 사용하려면을 사용하십시오 .


NSDecimalNumber ( NSNumber의 하위 클래스 )에는 원하는 모든 기능이 있습니다.

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

...

컴퓨팅 성능에 관심이 있다면 C ++ 배열 std :: vector 등으로 변환하십시오.

이제 저는 더 이상 C-Array를 사용하지 않습니다. 잘못된 인덱스 나 포인터를 사용하면 충돌하기가 너무 쉽습니다. 그리고 모든 새 []를 delete []와 페어링하는 것은 매우 지루합니다.


당신이 사용할 수있는

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

편집 : ohho가 관찰 한대로이 예제는 NSNumber정수 값을 보유 하는 두 인스턴스 를 더하기위한 것 입니다. NSNumber부동 소수점 값을 포함 하는 두 개의을 더하려면 다음을 수행해야합니다.

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

현재 가장 많이 뽑힌 답변 은 진단하기 어려운 버그와 부동 소수점 사용으로 인한 정밀도 손실로 이어질 것입니다. NSNumber 값에 대해 숫자 연산을 수행하는 경우 먼저 NSDecimalNumber로 변환하고 대신 해당 객체로 연산을 수행해야합니다.

로부터 문서 :

NSNumber의 변경 불가능한 하위 클래스 인 NSDecimalNumber는 10 진수 산술을 수행하기위한 객체 지향 래퍼를 제공합니다. 인스턴스는 가수 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)

왜 사용하지 NSxEpression않습니까?

NSNumber *x = @(4.5), *y = @(-2);

NSExpression *ex = [NSExpression expressionWithFormat:@"(%@ + %@)", x, y];
NSNumber *result = [ex expressionValueWithObject:nil context:nil];

NSLog(@"%@",result); // will print out "2.5"

다음과 같이 다른 인수로 평가하는 데 재사용 할 수있는 NSExpression을 빌드 할 수도 있습니다.

NSExpression *expr = [NSExpression expressionWithFormat: @"(X+Y)"];
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", y, @"Y", nil];
NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);

예를 들어, 매번 다른 "Y"값으로 동일한 구문 분석 된 표현식을 평가하는 루프를 반복 할 수 있습니다.

 for (float f=20; f<30; f+=2.0) {
    NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", @(f), @"Y", nil];
    NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);
 }

Swift에서는 Bolt_Swift 라이브러리 https://github.com/williamFalcon/Bolt_Swift를 사용하여이 기능을 얻을 수 있습니다 .

예:

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

참고 URL : https://stackoverflow.com/questions/494002/how-to-add-two-nsnumber-objects

반응형