Как разделить NSDecimalnumber между десятичным и целым и обратно - PullRequest
7 голосов
/ 28 января 2009

Я не могу понять, как получить целое и десятичное значение из NSDecimalnumber.

Например, если у меня есть 10,5, как получить 10 и 5?

А если у меня 10 & 5, как вернуться к 10,5?


Ммм, ладно, выглядит лучше!

Тем не менее, я согласен с потерей десятичных знаков.

Это приложение, которое будет международным. Например, если пользователь установил цену «124,2356», я хочу загрузить и сохранить точное число.


Ммм, ладно, это так, но не соблюдайте количество десятичных знаков. Если есть способ узнать, что из текущего локального я установлен.

Это потому, что они представляют валютные значения ...

Ответы [ 4 ]

19 голосов
/ 29 января 2009

Я использую 2 для шкалы, так как вы сказали, что это для валюты, но вы можете выбрать другую шкалу округления. Я также игнорирую любые исключения, которые может принести округление, поскольку это довольно простой пример.

NSDecimalNumberHandler *behavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:0 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
NSDecimalNumber *price = /* eg. 10.5 */;
NSDecimalNumber *dollars = [price decimalNumberByRoundingAccordingToBehavior: behavior];
NSDecimalNumber *cents = [price decimalNumberBySubtracting: dollars];

Это даст вам 10 и 0,5 в переменных dollars и cents соответственно. Если вам нужны целые числа, вы можете использовать этот метод для умножения вашего cents на степень 10.

cents = [cents decimalNumberByMultiplyingByPowerOf10: 2];

Что, в свою очередь, умножит вас cents на 100, давая вам 10 и 5 в dollars и cents. Вы также должны знать, что вы можете использовать отрицательные степени 10 здесь, чтобы разделить.

Итак,

cents = [cents decimalNumberByMultiplyingByPowerOf10: -2];

отменяет этот последний метод.

0 голосов
/ 28 января 2009

Если у вас нет доступа к математическим функциям, это может сработать:

double val = [dn doubleValue]; // dn is a NSDecimalNumber*
int intPart = (int) val;
double doublePart = (val - intPart); 

Это может доставить вам некоторые неприятности, цикл может никогда не закончиться, в этом случае вам придется поставить туда счетчик:

while (doublePart != (int)doublePart) doublePart*=10;
0 голосов
/ 29 января 2009

double floor (double x); - это функция POSIX. Эта функция может использоваться для нахождения наибольшего целочисленного значения, не превышающего x.

double x = 10.5;

double y = floor (x);
// y = 10.0

double z = x - y;
// z = 0.5
0 голосов
/ 28 января 2009

Не уверен, что имеет цель C с математическими функциями, но что-то вроде

Math.floor(10.5) = 10
(10.5 - 10) * 10 = 5

бит более ясного примера (cos of 10's)

Math.floor(20.4) = 20
(20.4 - 20) * 10 = 4;

Другая проблема

(5 / 10) = .5
10 + .5 = 10.5

Число 10, используемое в десятичных точках, зависит от количества десятичных знаков ... например

Math.floor(20.44) = 20
(20.44 - 20) * 100 = 44;

требует от вас времени на 100

...