Существует ли способ создать NSDecimal, не используя NSNumber и создавая автовыпущенные объекты?

Я выполняю много использований вычислений NSDecimal и создаю каждого NSDecimal структура с помощью следующей техники:

[[NSNumber numberWithFloat:kFloatConstant] decimalValue]

Я использую NSDecimal избегать использования автовыпущенный NSDecimalNumber объекты (если NSDecimalNumber подход к точным вычислениям используется). Однако кажется что NSNumber механизм создания также возвращает автовыпущенный NSNumber из которого извлечено десятичное значение.

Есть ли способ создать NSDecimal не используя NSNumber и создавая автовыпущенные объекты?

17
задан Arslan Ali 13 May 2014 в 04:17
поделиться

1 ответ

К сожалению, Apple не предоставляет никаких простых способов вкладывания значений в NSDecimal Struct. Само определения структуры можно найти в заголовке 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 в рамках моих высокоточных расчетов, и принять и экспортировать Nsstrings для обмена этими значениями с внешним миром. Чтобы создать NSDEcimal на основе NSString, вы можете использовать подход, который мы принимаем в рамках основной структуры :

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

    return result;
}

, используя NSCanner вместо Nsdecimalbater -initwithString: locale: На 90% быстрее в моих тестах.

27
ответ дан 30 November 2019 в 12:43
поделиться