이제 이것은 쉬울 것입니다. 그러나 어떻게 2를 합할 수 NSNumber
있습니까? 처럼:
[one floatValue] + [two floatValue]
아니면 더 나은 방법이 있습니까?
답변:
더 좋은 방법은 없지만 피할 수 있다면 실제로는하지 말아야합니다. NSNumber
스칼라 숫자에 대한 래퍼로 존재하므로 컬렉션에 저장하고 다른 것과 다형성으로 전달할 수 있습니다.NSObjects
. 그들은 실제 수학에서 숫자를 저장하는 데 실제로 사용되지 않습니다. 그것들에 대해 수학을한다면 그것은 단지 스칼라에 대한 연산을 수행하는 것보다 훨씬 느리기 때문에 아마도 그것을위한 편리한 방법이 없을 것입니다.
예를 들면 :
NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];
메시지 디스패치에 대해 최소 21 개의 명령어를 불고 있으며, 1 개의 명령어 값에 해당하는 수학을 수행하기 위해 메소드가 값 (아마도 수백 개)을 풀고 리 박스하는 데 필요한 코드가 얼마든지 있습니다.
따라서 딕셔너리에 숫자를 저장해야하는 경우를 사용하고 NSNumber
, 숫자 나 문자열이 될 수있는 것을 함수에 전달해야하는 경우를 사용하십시오 NSNumber
.
NSDecimalNumber ( NSNumber의 하위 클래스 )에는 원하는 모든 기능이 있습니다.
– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:
...
컴퓨팅 성능이 중요하다면 C ++ 배열 std :: vector 등으로 변환하십시오.
이제 저는 더 이상 C-Array를 사용하지 않습니다. 잘못된 인덱스 나 포인터를 사용하면 충돌하기가 너무 쉽습니다. 그리고 모든 새 []를 delete []와 페어링하는 것은 매우 지루합니다.
NSDecimalNumber
s를 추가 한 후 NSDecimalNumber
결과를 다시 변환하는 방법 은 NSNumber
무엇입니까? (이 질문은 두 가지의 추가에 관한 NSNumber
두 개의 추가하지, S NSDecimalNumber
들.)
@interface NSDecimalNumber : NSNumber
당신이 사용할 수있는
NSNumber *sum = @([first integerValue] + [second integerValue]);
편집 : ohho가 관찰 한대로이 예제는 NSNumber
정수 값을 보유 하는 두 인스턴스 를 더하기위한 것 입니다. 두 개를 더하고 싶다면NSNumber
부동 소수점 값을 포함 개의을 더하려면 다음을 수행해야합니다.
NSNumber *sum = @([first floatValue] + [second floatValue]);
int
나 long
또는 큰 동생 typedef
'편 NSInteger
에 NSNumber
객체 .
integerValue
잘립니다 float
. 이 답변은 어떻게 찬성 할 수 있습니까?
integerValue
숫자의 소수 부분을 보존하려면 왜 세상에서 사용 합니까?
현재 최다 투표 답변 은 진단하기 어려운 버그와 부동 소수점 사용으로 인한 정밀도 손실로 이어질 것입니다. 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