ios - ¿Hay una manera de crear un NSDecimal sin usar NSNumber y crear objetos lanzados automáticamente?
objective-c autorelease (2)
Desafortunadamente, Apple no proporciona ninguna manera fácil de poner valores en una estructura NSDecimal. La propia definición de estructura se puede encontrar en el encabezado NSDecimal.h:
typedef struct {
signed int _exponent:8;
unsigned int _length:4; // length == 0 && isNegative -> NaN
unsigned int _isNegative:1;
unsigned int _isCompact:1;
unsigned int _reserved:18;
unsigned short _mantissa[NSDecimalMaxSize];
} NSDecimal;
pero no sé si trataría de hacer ingeniería inversa de cómo las estructuras mantienen los valores. Los guiones bajos en los campos en la estructura indican que estos son privados y están sujetos a cambios. No me imagino que ocurran muchos cambios en las funciones mínimas de la función NSDecimal, pero en algún momento estaría nervioso por las cosas que se rompen.
Dado que, la inicialización de un NSDecimal a partir de un número de punto flotante se realiza mejor de la manera que describe. Sin embargo, tenga en cuenta que cada vez que use un valor de punto flotante, estará perdiendo la precisión que ganó al usar un NSDecimal y estará sujeto a errores de punto flotante.
Siempre trabajo solo con NSDecimals en mis cálculos de alta precisión, y admito y exporto NSStrings para intercambiar estos valores con el mundo exterior. Para crear un NSDecimal basado en una NSString, puede utilizar el enfoque que adoptamos en el marco Core Plot :
NSDecimal CPDecimalFromString(NSString *stringRepresentation)
{
NSDecimal result;
NSScanner *theScanner = [[NSScanner alloc] initWithString:stringRepresentation];
[theScanner scanDecimal:&result];
[theScanner release];
return result;
}
Usar un NSScanner en lugar de NSDecimalNumber -initWithString:locale:
es aproximadamente un 90% más rápido en mis puntos de referencia.
Estoy realizando una serie de cálculos utilizando NSDecimal
y estoy creando cada estructura NSDecimal
utilizando la siguiente técnica:
[[NSNumber numberWithFloat:kFloatConstant] decimalValue]
Estoy utilizando NSDecimal
para evitar el uso de objetos NSDecimalNumber
publicados NSDecimalNumber
(si se NSDecimalNumber
método NSDecimalNumber
para realizar cálculos precisos). Sin embargo, parece que el mecanismo de creación de NSNumber
también devuelve un NSNumber NSNumber
del cual se extrae el valor decimal.
¿Hay una manera de crear un NSDecimal
sin usar NSNumber y crear objetos lanzados automáticamente?
Para responder a la parte "sin objetos lanzados automáticamente" , simplemente:
NSDecimalNumber *intermediateNumber = [[NSDecimalNumber alloc] initWithFloat:kFloatConstant];
NSDecimal decimal = [intermediateNumber decimalValue];
[intermediateNumber release];