objective-c cocoa math nsdecimalnumber

objective c - Cómo dividir un NSDecimalnumber entre decimal y entero y viceversa



objective-c cocoa (4)

No puedo entender cómo obtener el valor integral y decimal de un NSDecimalnumber.

Por ejemplo, si tengo 10,5, ¿cómo obtener 10 y 5?

Y si tengo 10 y 5, ¿cómo volveré a 10,5?

Mmm está bien, ¡eso se ve mejor!

Sin embargo, tengo la preocupación de perder decimales.

Esto es para una aplicación que será internacional. Si, por ejemplo, un usuario establece el precio "124,2356", quiero cargar y guardar el número exacto.

Mmm está bien, ese es el camino, pero no respetas el número de decimales. Si existe una forma de saberlo desde el local actual estoy configurado.

Esto se debe a que representan valores de moneda ...


No estoy seguro de qué funciones matemáticas tiene el objetivo c, pero algo así como

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

un poco más claro ejemplo (cos de los 10)

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

El otro problema

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

El 10 usado en los puntos decimales depende de la cantidad de decimales ... por ejemplo

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

te exige tiempos por 100


Si no tiene acceso a los fns matemáticos, esto puede funcionar:

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

Esto puede ocasionarle problemas, el ciclo nunca terminará, en ese caso tendrá que poner un contador allí:

while (doublePart != (int)doublePart) doublePart*=10;


double floor (double x); es una función POSIX Esta función se puede usar para encontrar el valor entero más alto que no sea mayor que x .

double x = 10.5; double y = floor (x); // y = 10.0 double z = x - y; // z = 0.5


Estoy usando 2 para la escala ya que dijiste que esto era por moneda, pero puedes elegir usar otra escala de redondeo. También ignoro las excepciones que pueda ocasionar el redondeo ya que este es un ejemplo bastante simple.

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

Eso le dará 10 y 0.5 en las variables de dollars y cents , respectivamente. Si desea números enteros, puede usar este método para multiplicar sus cents por una potencia de 10.

cents = [cents decimalNumberByMultiplyingByPowerOf10: 2];

Lo cual a su vez multiplicará sus cents por 100, lo que le da 10 y 5 en dollars y cents . También debes saber que puedes usar poderes negativos de 10 aquí para dividir.

Asi que,

cents = [cents decimalNumberByMultiplyingByPowerOf10: -2];

desharía ese último método.