Colección de citas famosas - Slogan de motivación - Desarrollo de iOS: Cálculo preciso de moneda en Objective-C

Desarrollo de iOS: Cálculo preciso de moneda en Objective-C

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

El desarrollo de iOS a veces requiere un procesamiento estricto de nuestra precisión, como el número de fondos de usuario Procesamiento, una mejor sugerencia es que el servidor devuelva directamente la cantidad como un tipo de cadena, para que el cliente no tenga que preocuparse por la visualización de precisión si necesitamos operar con los datos devueltos por el servidor, por ejemplo: dos números en el servidor flotan a = 0,01, int b = 99999999, el resultado de multiplicar los dos números es 999999,99, por lo que debemos considerar la cuestión de la precisión. Otro ejemplo es plano a = 123456789,12, int b = 10000, dividiendo los dos números.

En el desarrollo de iOS, en relación con el cálculo del precio de la moneda, es necesario prestar atención a la precisión del cálculo. Incluso con sólo dos decimales pueden producirse errores. El uso de operaciones de tipo flotante es completamente insuficiente. Después de algunas pruebas, finalmente elegí usar el NSDecimalNumber de la API proporcionada por el sistema para una mejor solución.

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

Las siguientes son algunas pruebas básicas,

Datos sin procesar

floata =0.01

intb =99999999

<; p> doublec =0.0;

1: Usar aritmética de punto flotante,

c = a*b;

NSLog(@"f",c);

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

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

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

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

p>

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

c = a*(double)b;

NSLog(@"f", c) ;

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

Se ha mejorado la precisión de la operación doble, pero el valor de punto flotante ya es inexacto Incluso si el almacenamiento. el espacio es suficiente, todavía es un valor inexacto.

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

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

p>

3: Convierta los datos originales calculados en datos de tipo doble puro mediante la conversión con NSString, para que la precisión del cálculo pueda cumplir con los requisitos.

NSString*objA = [NSStringstringWithFormat:@".2f", a];

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

c = [objAdoubleValue] * [objBdoubleValue];

NSLog(@".2f", c

El resultado calculado sigue siendo relativamente preciso, pero Necesita realizar procesamiento de entrada formateada y salida formateada. Al mismo tiempo, al usar NSString para convertir, esta forma de escribir parece extraña.

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

4: Personalmente, sigo prefiriendo usar 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 salida formateada.

La precisión de su cálculo es relativamente alta. Esta es la API recomendada oficialmente para el cálculo de moneda. Hay una interfaz API separada para cálculos como la multiplicación y la división.

NSString *decimalNumberMutiplyWithString(NSString*multiplierValue, NSString*multiplicandValue)

{

NSDecimalNumber*multiplierNumber = [NSDecimalNumberdecimalNumberWithString: multiplierValue]

> NSDecimalNumber*multiplicandNumber = [NSDecimalNumberdecimalNumberWithString:multiplicandValue];

NSDecimalNumber*product = [multiplicandNumberdecimalNumberByMultiplyingBy:multiplierNumber];

return[productstringValue];

} p>

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

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

Esto es solo una prueba, por lo que el nombre de la interfaz está escrito de manera aproximada. El nombre no es tan particular, espero que se pueda expresar claramente. .

En general, para los cálculos de moneda, se debe prestar atención a la cuestión de la precisión. Al mismo tiempo, al calcular, debe dar prioridad a la API proporcionada por el marco. De lo contrario, debe utilizar operaciones de tipo con suficiente precisión. Al mismo tiempo, debe proporcionar explicaciones suficientes para las interfaces que escribe y requiere que los desarrolladores. utilizarlos de acuerdo con las especificaciones.

Cuando no se puede garantizar una precisión suficiente, aún así es aceptable evitar la responsabilidad exigiendo explicaciones adecuadas. Es mejor recibir al menos algunas quejas que cometer un error.