Desafortunadamente, Apple no proporciona ninguna forma fácil de poner valores en una estructura NSDecimal. La definición misma estructura se puede encontrar en la cabecera 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é que me gustaría ir por ahí tratando de cómo las estructuras tienen valores de ingeniería inversa. Los guiones bajos en los campos en la estructura indican que estos son privados y están sujetos a cambios. No creo que se produzcan muchos cambios en las funciones NSDecimal de bajo nivel, pero estaría nerviosa porque las cosas se rompan en algún momento.
Dado que inicializar un NSDecimal a partir de un número de punto flotante se realiza mejor de la manera que usted describe. Sin embargo, tenga en cuenta que cada vez que use un valor de coma flotante perderá la precisión que ganó al usar un NSDecimal y se someterá a errores de coma flotante.
Siempre trabajo solo con NSDecimales dentro de mis cálculos de alta precisión, y tomo y exporto NSStrings para intercambiar estos valores con el mundo exterior. Para crear un NSDecimal basado en un NSString, se puede utilizar el enfoque que tomamos en el Core Plot framework:
NSDecimal CPDecimalFromString(NSString *stringRepresentation)
{
NSDecimal result;
NSScanner *theScanner = [[NSScanner alloc] initWithString:stringRepresentation];
[theScanner scanDecimal:&result];
[theScanner release];
return result;
}
El uso de un NSScanner en lugar de NSDecimalNumber -initWithString:locale:
es aproximadamente un 90% más rápido en mis puntos de referencia.
Realmente parece como 'NSDecimal' fue diseñado para las cosas con rangos de precisión específicos donde la precisión exacta es importante, como moneda, que se tienden a no querer convertir ** ao desde ** a 'float' o 'double' debido al riesgo de pérdida de precisión. ¿Podrías decirnos más sobre tu caso de uso? –