¿Obtiene exponente de NSDecimalNumber en Objective-C?

Dado un NSDecimalNumber, ¿cómo puedo encontrar el exponente (escala)?

Aunque en principio debería ser posible hacerlo al convertir primero a un NSString seguido de alguna manipulación de cadena fea, prefiero evitarlo.

Con un Java BigDecimal, puedo llamar al método scale () para get la escala.

¿Existe un método similarmente conciso para NSDecimalNumber?

Si realmente necesita el exponente por algún motivo (que no sea simplemente mostrar, que puede configurar un formateador de numbers para darle), puede get el primitivo doble con el método -doubleValue y luego usar frexp(3) para get la mantisa y Valores exponentes.

El layout completo detrás de los objects para hacer y almacenar matemáticas de coma flotante es que puede manejar errores computacionales y de precisión de manera más efectiva, sin embargo, la limitación de ese layout es una vez que convierte de un escalar (como un double o la combinación de una mantisa y exponente), se espera que permanezca dentro del marco del object y no se convierta nuevamente a un formatting (potencialmente) less preciso.

Sugiero que usar -doubleValue sea ​​la mejor opción, ya que otras respuestas sugieren acceder a loggings de estructura privada que pueden cambiar, y el uso de estos sugiere que no hay pérdida de precisión, cuando, de hecho, puede haber muy bien (como se documenta en los files de encabezado). Al convertir a un doble, usted y aquellos que usan / leen su código saben exactamente qué errores de precisión pueden ser posibles porque el tipo está muy bien comprendido y está muy bien documentado.

Finalmente, si quiere asegurarse de que si una conversión va a causar un error, puede crear y usar un NSDecimalNumberHandler que le proporcionará información sobre qué tipo de errores de networkingondeo / precisión puede esperar al convertir al tipo doble escalar.

También sugiero que agregue una request de mejora utilizando el reportero de errores de Apple que indica que desea acceder directamente al exponente, así como posiblemente agregar un tipo de precisión más alta, como un método -longDoubleValue .

Editar incluye más información

Puede acceder a él en NSDecimal :

 int exponent = decimalNumber.decimalValue._exponent; 

No, no parece que NSDecimalNumber tiene un equivalente. Creo que tendrás que escribir la tuya.

Si no le molesta cavar un poco (e ignorar las advertencias de documentation), sin embargo, puede ver la estructura NSDecimal que se devuelve desde -decimalValue : tiene una serie de campos que probablemente podría get. Si esto es subjetivamente mejor o peor que sus manipulaciones NSString depende de usted.

Si desea tener la expresión para estar en la forma base-10 (frexp (3) parece que solo hace base-2), puede intentar esto:

 double mantissa = [someDecimalNumber doubleValue]; int exp = 0; if (mantissa >= 1.0f) { while (mantissa >= 1.0f) { mantissa = mantissa / 10.0f; exp++; } } else { while (mantissa*10.0f < 1.0f) { mantissa = mantissa * 10.0f; exp--; } } NSLog(@"%f = %fx 10^%d", [someDecimalNumber doubleValue], mantissa, exp); 

Puede comparar el número con NSDecimalNumber instancias de NSDecimalNumber creadas con mantisa igual a 1, cambiando el exponente. Puede funcionar como una búsqueda binaria.