Как разделить NSDecimalNumber на целое число?

Я не думаю, что исчерпывающий, базовый ответ на этот вопрос существует здесь, и поиск в Google не помог.

Задача: учитывая NSDecimalNumber, разделите это на int и верните другое NSDecimalNumber. Пояснение: amount_text ниже необходимо преобразовать в NSDecimalNumber, поскольку это валюта. Результат должен быть NSDecimalNumber, но мне все равно, в каком формате делитель.

Что у меня есть до сих пор:

// Inputs
NSString *amount_text = @"15.3";
int n = 10;

NSDecimalNumber *total = [NSDecimalNumber decimalNumberWithString:amount_text]; 

// Take int, convert to string. Take string, convert  to NSDecimalNumber.
NSString *int_string = [NSString stringWithFormat:@"%d", n];
NSDecimalNumber *divisor = [NSDecimalNumber decimalNumberWithString:int_string];
NSDecimalNumber *contribution = [total decimalNumberByDividingBy:divisor];

Конечно, это можно сделать более простым способом?


person Unapiedra    schedule 04.12.2013    source источник


Ответы (4)


Есть ли причина, по которой вы используете NSDecimalNumber? Это можно сделать проще так:

// Inputs
NSString *amount_text = @"15.3";
int n = 10;

float amount = [amount_text floatValue];
float result = amount / n;

Если вы действительно хотите сделать это с помощью NSDecimalNumber:

// Inputs
NSString *amount_text = @"15.3";
int n = 10;

NSDecimalNumber *total = [NSDecimalNumber decimalNumberWithString:amount_text];
NSDecimalNumber *divisor = [NSDecimalNumber decimalNumberWithMantissa:n exponent:0 isNegative:NO];
NSDecimalNumber *contribution = [total decimalNumberByDividingBy:divisor];
person DrummerB    schedule 04.12.2013
comment
Я использую NSDecimalNumber, потому что имею дело с валютами. Но ваш вариант работает. - person Unapiedra; 04.12.2013
comment
Если вам нужна высокая точность для ваших значений, это также будет причиной использования NSDecimalNumber. - person Phlibbo; 26.01.2015

Вы всегда можете использовать инициализаторы при создании NSDecimalNumber. Поскольку это подкласс NSNumber, NSDecimalNumber переопределяет инициализаторы.

Так что вы можете сделать

NSDecimalNumber *decimalNumber = [[NSDecimalNumber alloc] initWithInt:10];

однако вам следует быть осторожным, если вы выполняете высокоточные вычисления, так как при использовании этих инициализаторов возникают некоторые проблемы. Вы можете прочитать об этом здесь в более деталь.

person mrt    schedule 04.12.2013
comment
Какой из них лучше: ваше решение или решение DrummerB (второе)? Допустим, мой десятичныйЧисло/делитель находится в диапазоне от 1 до 10. - person Unapiedra; 04.12.2013
comment
Учитывая обсуждение в связанном вопросе, вам, вероятно, следует выбрать второе решение DrummerB [NSDecimalNumber decimalNumberWithMantissa:n exponent:0 isNegative:NO]; - person Felix Lamouroux; 04.12.2013
comment
Вы получаете большую точность со вторым решением DrummerB, но вы также должны быть в порядке с inits. Так что вам решать, нужна ли вам более высокая точность или нет. - person mrt; 04.12.2013

В качестве альтернативы (потенциально потеряв некоторую точность):

double amount = 15.3;
double n = 10.0;
double contribution = amount / n;

// conversion to decimal
NSString *string = [NSString stringWithFormat:@"%f", n];
NSDecimalNumber *contribution_dec = [NSDecimalNumber decimalNumberWithString:string];

еще лучше (если n = 10):

[dec decimalNumberByMultiplyingByPowerOf10:-1];
person Felix Lamouroux    schedule 04.12.2013
comment
Уточнил мой вопрос: мне нужен NSDecimalNumber. Отличное мышление с decimalNumberByMultiplyingByPowerOf10, однако в основном у меня не будет степени 10 делителей. - person Unapiedra; 04.12.2013

По твоему коду...

Вы создаете NSDecimalNumber из строки, а затем выполняете с ней манипуляции.

Я никогда этого не делаю. Если вам не нужен NSDecimalNumber, если вам не нужен объект Objective-C в штучной упаковке, избегайте этого, используйте float и double.


Если вы хотите сделать это намного проще, вы можете сделать это так:

float quotient = [total floatValue]/n;

or,

float quotient = [contribution floatValue]/n;

EDIT: если вы хотите по какой-либо конкретной причине использовать коробочный тип, вы можете использовать его как:

NSString *amount_text = @"15.3";
int n = 10;

NSDecimalNumber *total = [NSDecimalNumber decimalNumberWithString:amount_text];
NSDecimalNumber *divisor = [[NSDecimalNumber alloc] initWithInt:n];
NSDecimalNumber *contribution = [total decimalNumberByDividingBy:divisor];
person Anoop Vaidya    schedule 04.12.2013
comment
Уточнение: мне нужно использовать NSDecimalNumber. - person Unapiedra; 04.12.2013
comment
Могу ли я узнать причину этого? поскольку вы конвертируете строку в int, затем десятичное число снова возвращается к float/int и строке... почему эти накладные расходы? В любом случае обновил мой ответ, чтобы дать вам коробочный тип - person Anoop Vaidya; 04.12.2013
comment
У меня есть пользователь, вводящий сумму с помощью цифровой клавиатуры. Это я конвертирую в NSDecimalNumber total, который мне тоже где-то нужен. Здесь я хочу разделить сумму на n предметов. - person Unapiedra; 04.12.2013