2009-01-28 12 views
7

No entiendo cómo obtener el valor decimal integral & de un NSDecimalnumber.Cómo dividir un NSDecimalnumber entre decimal y entero y reverso

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

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


Mmm ok, that is looking better!

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 & guardar el número exacto.


Mmm bien, ese es el camino, pero no respeta el n. ° de decimales. Si existe una forma de saberlo desde el local actual estoy configurado.

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

Respuesta

19

Estoy usando 2 para la báscula ya que dijo que esto era por moneda, pero puede optar por utilizar 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]; 

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

cents = [cents decimalNumberByMultiplyingByPowerOf10: 2]; 

que a su vez se multiplican por cents 100, que le da 10 y 5 en dollars y cents. También debes saber que puedes usar poderes negativos de 10 aquí para dividir.

Así,

cents = [cents decimalNumberByMultiplyingByPowerOf10: -2]; 

desharía ese último método.

+3

¿no debería ser 0 para la balanza? Usando una escala de 2, un precio de 10.5 se redondeará dando dólares de 10.5. Restar eso del precio dará centavos de 0 –

+0

la escala debe ser 0, no 2. – ejel

+0

Creo que esto no funciona cuando el número es negativo, ya que 'RoundDown' se redondea desde cero y luego según . Y sería fácil cambiar entre los modos de redondeo hacia arriba o hacia abajo basados ​​en el valor negativo, excepto que la prueba de un valor negativo no es sencilla, es más fácil hacer 'num.doubleValue> = 0'. Al menos 'Decimal' en Swift expone una propiedad 'sign'. –

0
No

seguro de qué funciones matemáticas c objetivo tiene sino algo así como

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

poco de un ejemplo más claro (cos de la década 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 utilizado en los puntos decimales depende de la cantidad de decimales ... por ejemplo

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

requiere que los tiempos por 100

0

Si usted no tiene acceso a los FNS matemáticas, esto puede funcionar:

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

esto le puede dar algunos problemas, el bucle nunca se puede dar por terminado, en ese caso, tendrá que poner un contador de allí:

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

double floor (double x); es una función POSIX. Esta función se puede utilizar 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 
Cuestiones relacionadas