ios - decimal swift




거기에 NSNumber를 사용하지 않고 NSDecimal 만들고 autoreleased 개체를 만드는 방법이 있나요? (2)

NSDecimal 사용하여 여러 가지 계산을 수행하고 있으며 다음 기법을 사용하여 각 NSDecimal 구조체를 만듭니다.

[[NSNumber numberWithFloat:kFloatConstant] decimalValue]

정확한 계산에 NSDecimalNumber 접근법이 사용되는 경우 자동 반복 NSDecimalNumber 객체 사용을 피하기 위해 NSDecimal 을 사용하고 있습니다. 그러나 NSNumber 생성 메커니즘은 또한 십진수 값이 추출되는 자동 변환 된 NSNumber 를 반환하는 것으로 보입니다.

거기에 NSNumber를 사용하지 않고 NSDecimal 만들고 autoreleased 개체를 만드는 방법이 있나요?


불행히도 Apple은 NSDecimal 구조체에 값을 넣는 쉬운 방법을 제공하지 않습니다. 구조체 정의 자체는 NSDecimal.h 헤더에서 찾을 수 있습니다.

typedef struct {
    signed   int _exponent:8;
    unsigned int _length:4;     // length == 0 && isNegative -> NaN
    unsigned int _isNegative:1;
    unsigned int _isCompact:1;
    unsigned int _reserved:18;
    unsigned short _mantissa[NSDecimalMaxSize];
} NSDecimal;

하지만 구조체의 값을 유지하는 방법을 리버스 엔지니어링하려고 할 것이라고는 생각하지 않습니다. 구조체의 필드 밑줄은 이러한 속성이 비공개이며 변경 될 수 있음을 나타냅니다. 저수준의 NSDecimal 함수에서 많은 변화가 일어난다 고 생각지 않지만, 어떤 점에서 깨는 것에 대해서는 긴장 될 것입니다.

이 점을 감안할 때 부동 소수점 숫자에서 NSDecimal을 초기화하는 것이 가장 좋은 방법입니다. 그러나 부동 소수점 값을 사용할 때마다 NSDecimal을 사용하여 얻은 정밀도를 잃어 버리고 부동 소수점 오류가 발생합니다.

난 항상 내 고정밀도 계산 내에서 NSDecimals 만 사용하고 외부 세계와이 값을 교환하기 위해 NSString을 가져 와서 내보내십시오. NSString을 기반으로 NSDecimal을 만들려면 Core Plot 프레임 워크 에서 사용하는 방법을 사용할 수 있습니다.

NSDecimal CPDecimalFromString(NSString *stringRepresentation)
{
    NSDecimal result;
    NSScanner *theScanner = [[NSScanner alloc] initWithString:stringRepresentation];
    [theScanner scanDecimal:&result];
    [theScanner release];

    return result;
}

NSDecimalNumber 대신 NSScanner 사용 - initWithString -initWithString:locale: 내 벤치 마크에서 약 90 % 빠릅니다.


"자동 접하지 않은 객체가없는" 부분에 대답하려면 간단히 다음을 수행하십시오.

NSDecimalNumber *intermediateNumber = [[NSDecimalNumber alloc] initWithFloat:kFloatConstant];
NSDecimal decimal = [intermediateNumber decimalValue];
[intermediateNumber release];




autorelease