? Estoy confundido por NSDecimalNumber y sus "comportamientos". Tengo un NSDecimalNumber que representa un valor en dólares, digamos $ 37.50. Me gustaría saber cuántas veces digamos 5.0 en ese número y luego saber qué sobra. Puedo obtener la división recta y obtener 7.50 pero quiero 7 mod 2.50. Podría convertir a un número entero pero necesito guardar los "centavos" para preguntarme si hay algunos trucos en el marco.¿Cómo se obtiene el int y el módulo (mod) de la división con un NSDecimalNumber
Respuesta
En teoría, podría hacer algunos trucos con los métodos NSDecimalNumber decimalNumberByDividingBy:
, decimalNumberByMultiplyingBy:
y decimalValue
. Divida los números, tome la estructura decimal, calcule el resto de la estructura, luego cree un nuevo número decimal con ese resto y multiplique el resto por el número original.
La manera más fácil de hacerlo, sin embargo, sería averiguar la precisión máxima que desea (llámala N lugares después del punto decimal), multiplique el número por 10eN, luego simplemente tome el valor entero y haga su división y mod sobre eso. Sin embargo, corres el riesgo de perder datos, especialmente con números muy grandes, así que verifica el número más grande que desees y averigua qué tipo de datos, si hay alguno, funcionará para ti. NSNumber no es compatible con unsignedLongLongValue
.
- Divida el dividendo por el divisor, redondeando hacia abajo. Esto te da el cociente.
- Multiplica el divisor por el cociente.
- Reste eso del dividendo. Esto te da el resto.
(37.50 // 5) == 7; 7 * 5 == 35; 37.50 - 35 = 2.50.
(Nota:... //
es operador de Python para la división integrante He prestado aquí Obviamente, se debe en realidad no intenta utilizar //
para la división en código Objective-C)
Usando ejemplo Peter Hoseys, pero con código de iOS:
NSDecimalNumber *dividend = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:37.5] decimalValue]];
NSDecimalNumber *divisor = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:5.0] decimalValue]];
NSDecimalNumber *quotient = [dividend decimalNumberByDividingBy:divisor withBehavior:[NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:0 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO]];
NSDecimalNumber *subtractAmount = [quotient decimalNumberByMultiplyingBy:divisor];
NSDecimalNumber *remainder = [dividend decimalNumberBySubtracting:subtractAmount];
Tiene que establecer el modo de redondeo a la derecha si uno de dividendo o divisor es negativo. 'NSRoundingMode roundingMode = ((dividend.floatValue <0)^(divisor.floatValue <0))? NSRoundUp: NSRoundDown; ' – user500
Aquí es una categoría NSDecimalNumber
que también trabaja con números negativos y divisores negativos:
- (BOOL)isNegative
{
return (NSOrderedDescending == [[NSDecimalNumber zero] compare:self]);
}
- (NSDecimalNumber *)invertedNumber
{
NSDecimalNumber *negOne = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:0 isNegative:YES];
return [self decimalNumberByMultiplyingBy:negOne];
}
- (NSDecimalNumber *)moduloFor:(NSDecimalNumber *)divisor
{
NSRoundingMode roundingMode = ([self isNegative]^[divisor isNegative]) ? NSRoundUp : NSRoundDown;
NSDecimalNumberHandler *rounding = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:roundingMode
scale:0
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:NO];
// divide and get the remainder
NSDecimalNumber *quotient = [self decimalNumberByDividingBy:divisor withBehavior:rounding];
NSDecimalNumber *subtract = [quotient decimalNumberByMultiplyingBy:divisor];
NSDecimalNumber *modulo = [self decimalNumberBySubtracting:subtract];
if ([divisor isNegative]) {
return [modulo invertedNumber];
}
return modulo;
}
- 1. nth-child con mod (o módulo) operador
- 2. ¿Cómo se usa NSDecimalNumber?
- 3. Cómo implementar el operador de mod en el ensamblado
- 4. resultado inesperado en el tiempo/división int
- 5. C++ rápida división/mod por 10^x
- 6. ¿El funcionamiento de MOD requiere más CPU que la multiplicación?
- 7. ¿Cómo se hace el módulo o el resto en Erlang?
- 8. ¿Cómo redondear la división de enteros y tener el resultado int en Java?
- 9. ¿Cómo obtener el cociente y el resto de la división
- 10. División de String y ponerlo en la matriz int
- 11. Cómo dividir un NSDecimalnumber entre decimal y entero y reverso
- 12. ¿Cómo se usa el módulo para flotación/doble?
- 13. Cargar módulo en apache + mod-wsgi
- 14. ¿Cómo se obtiene el tamaño de un archivo en MATLAB?
- 15. División firmada con el numerador sin signo
- 16. ¿Cómo se puede usar el módulo de registro en python con el módulo unittest?
- 17. ¿Cómo se obtiene el valor seleccionado de un Spinner?
- 18. Cómo se obtiene el nombre del dispositivo de un iPhone
- 19. ¿Cómo se obtiene el tiempo pasado de un verbo?
- 20. de estilo Python división de enteros y módulo en C
- 21. ¿Cómo puedo hacer mod sin un operador de mod?
- 22. División int Java me confunde
- 23. Cómo importar un módulo en Python con importlib.import_module
- 24. Backbone.js y mod rewrite
- 25. ¿Cómo se obtiene el icono, el tipo MIME y la aplicación asociada a un archivo en el escritorio de Linux?
- 26. ¿Algoritmo rápido de módulo 3 o división?
- 27. ¿Cómo se obtiene el evento táctil en un CALayer?
- 28. Cómo calcular un mod b en python?
- 29. ¿Cómo se obtiene el ancho de la pantalla en java?
- 30. ¿Cómo se obtiene el ancho y la altura de una matriz multidimensional?
Para redondear, use floor() de math.h - toma un doble y devuelve un doble. –
Si usa números decimales, intente permanecer dentro de ese tipo tanto como sea posible. A saber, para redondear use decimalNumberByRoundingAccordingToBehavior :. – Tim
Mejor aún, use 'decimalNumberByDividingBy: withBehavior:' para hacer la división. Entonces no necesitas redondear por separado. –