Я выполняю много использований вычислений NSDecimal
и создаю каждого NSDecimal
структура с помощью следующей техники:
[[NSNumber numberWithFloat:kFloatConstant] decimalValue]
Я использую NSDecimal
избегать использования автовыпущенный NSDecimalNumber
объекты (если NSDecimalNumber
подход к точным вычислениям используется). Однако кажется что NSNumber
механизм создания также возвращает автовыпущенный NSNumber
из которого извлечено десятичное значение.
Есть ли способ создать NSDecimal
не используя NSNumber и создавая автовыпущенные объекты?
К сожалению, 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% быстрее в моих тестах.