Red de conocimiento informático - Aprendizaje de programación - Desarrollo de IOS: Cálculo de divisas con precisión de objetivos

Desarrollo de IOS: Cálculo de divisas con precisión de objetivos

Este artículo es una reproducción de: Desarrollo de iOS: Cálculo preciso de moneda Objective-C - Blog de tecnología ArthurChen-51CTO

En el desarrollo de iOS, a veces debemos ocuparnos estrictamente de la precisión, como la cantidad de fondos del usuario. . Una mejor sugerencia es que la cantidad devuelta directamente por el servidor sea de tipo cadena, para que el cliente no tenga que preocuparse por la precisión de la visualización. Si necesitamos operar los datos devueltos por el servidor, como dos números en el servidor, float A = 0.01, int B = 9999999, el resultado de multiplicar los dos números es 99999.99. Otro ejemplo es A = 123456789,12, int B = 10000, se dividen dos números.

En el desarrollo de iOS, es necesario prestar atención a la precisión del cálculo relacionado con el cálculo del precio de la moneda. Incluso si son sólo dos decimales, habrá errores. Usar operaciones de punto flotante no es suficiente. Después de algunas pruebas, terminamos eligiendo NSDecimalNumber usando la API proporcionada por el sistema como una mejor solución.

Como biblioteca externa, en vista de la continuación de la versión, mantenemos el tipo plano externo, no cambiamos la interfaz y elegimos la adaptación interna.

A continuación se muestran algunas pruebas básicas.

Datos originales

float=0.01;

intb=99999999

doublec=0.0

1: uso Operación de coma flotante,

c = a * b;

NSLog(@"%f ",

NSLog(@"%.2f "); , c);

El uso de almacenamiento de tipo dual no toca la esencia del problema y no puede resolverlo en absoluto.

2011-12-30 11:04:00.121Sin título[2912:207]1000000.00000

2011-12-30 11:04:00.123Sin título[2912:207]1000000.00

2. Utilice la conversión de tipos para mejorar la precisión.

c = a *(doble)b;

NSLog(@"%f ", c);

NSLog(@"%.2f ", c);

Se ha mejorado la precisión de las operaciones dobles, pero el valor de los números de punto flotante ya no es exacto. Incluso si el espacio de almacenamiento es suficiente, sigue siendo inexacto.

2011-12-30 11:04:00.123Sin título[2912:207]9999999.9676648

2011-12-30 11:04:00.124Sin título[2912:207] 999999.97

3. Convierta los datos originales calculados en datos puros de doble precisión mediante la conversión con NSString, de modo que la precisión del cálculo cumpla con los requisitos.

ns cadena * objA =[NSStringstringWithFormat:@ "% . 2f", a];

ns cadena * objB =[NSStringstringWithFormat:@"% . 2f", (doble) b];

c =[objAdoubleValue]*[objBdoubleValue];

NSLog(@"%.2f ", c);

Los resultados del cálculo son relativamente preciso, pero requiere entrada formateada y procesamiento de formato de impresión. También usar NSString para la conversión parece un poco extraño.

2011-12-30 11:04:00.190Untitled[2912:207] 999999.99

4. Personalmente prefiero utilizar los tipos proporcionados por el sistema para los cálculos. Mediante el método de cálculo proporcionado por NSDecimalNumber, se pueden calcular datos precisos sin utilizar el formato de impresión.

Su precisión de cálculo es relativamente alta y es la API de cálculo de moneda recomendada oficialmente. Hay interfaces API separadas para multiplicación y división.

cadena ns * número decimalmutiplywitstring (cadena ns * valor multiplicador, cadena ns * valor multiplicador)

{

NSDecimalNumber * número multiplicador =[NSDecimalNumberdecimalNumberWithString:valor multiplicador] ;

NSDecimalNumber *multiplyand number =[NSDecimalNumberdecimalNumberWithString:valor multiplicador];

NSDecimalNumber * producto =[multiplicarand decimalnumberbymultiplyingby:multiplicador número];

return[productstringValue] ;

}

NSLog(@"% @",decimalNumberMutiplyWithString([NSStringstringWithFormat:@"% f",a],[NSStringstringWithFormat:@ "% d", b]) ;

2011-12-30 11:0 4:00.251 Sin título [2912:207] 999999.99

Es solo una prueba, por lo que el nombre de la interfaz está escrito. Es aproximado y el La adquisición de nombres no es tan particular. Espero que se pueda expresar claramente.

En general, debe prestar atención a la precisión de los cálculos de moneda. Al operar, debe dar prioridad al uso de la API proporcionada. framework Utilice operaciones de tipo con suficiente precisión y explique las interfaces que escribe con suficiente claridad, lo que requiere que los desarrolladores las utilicen de acuerdo con las especificaciones.

Si no se garantiza que sea lo suficientemente preciso, debe evadir la responsabilidad. ¿Requiere explicaciones apropiadas? Es aceptable. Al menos es mejor que se quejen que cometer un error.