2013-12-04 2 views
2

Я не думаю, что всеобъемлющий базовый ответ на этот вопрос существует здесь, а поисковая система не помогла.Как разделить NSDecimalNumber на целое число?

Задача: Дано 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]; 

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

ответ

4

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

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

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

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

+0

Какой из них лучше: ваше решение или второе решение DrummerB? Скажем, мой десятичный номер/делитель находится между 1 и 10. – Unapiedra

+0

Учитывая обсуждение в связанном вопросе, вы, вероятно, должны пойти с вторым решением DrummerB '[NSDecimalNumber decimalNumberWithMantissa: n exponent: 0 isNegative: NO];' – FelixLam

+0

Вы получаете больше точности с DrummerB's второе решение, но с вами тоже должно быть хорошо. Поэтому вам решать, нужна ли вам больше точности или нет. – mrt

0

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

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]; 

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

[dec decimalNumberByMultiplyingByPowerOf10:-1]; 
+0

Уточненный вопрос: мне нужен NSDecimalNumber. Великое мышление с 'decimalNumberByMultiplyingByPowerOf10', однако у меня будет не-сила 10 дивизоров в основном. – Unapiedra

1

В соответствии с вашим кодом ...

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

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


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

float quotient = [total floatValue]/n; 

или,

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]; 
+0

Уточнение: мне нужно использовать NSDecimalNumber. – Unapiedra

+0

Могу ли я узнать причину этого? поскольку вы преобразовываете строку в int, затем десятичное число снова возвращается к float/int и string ... почему это накладные расходы? Anyways обновил мой ответ, чтобы дать вам коробку типа –

+0

У меня есть тип пользователя в размере с помощью клавиатуры numpad. Это я конвертирую в 'NSDecimalNumber total', который мне также нужен где-то в другом месте. Здесь я хочу разделить количество среди n элементов. – Unapiedra

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]; 
+0

Я использую NSDecimalNumber, потому что я имею дело с валютами. Но ваша альтернатива работает. – Unapiedra

+0

Если вам нужна высокая точность для ваших значений, это также послужило бы причиной использования NSDecimalNumber – Phlibbo

Смежные вопросы