Parece que encuentro un problema extraño en Objective-C convirtiendo un flotador en un NSNumber (envolviéndolo por conveniencia) y luego convirtiéndolo de nuevo en un flotador .Pérdida de precisión convirtiendo 'float' en NSNumber, volviendo a 'float'
En pocas palabras, una clase de mina tiene una propiedad red
, que es un flotador de 0.0
a 1.0
:
@property (nonatomic, assign) float red;
Este objeto está comparando sí mismo a un valor que se carga desde el disco, para fines de sincronización . (El archivo puede cambiar fuera de la aplicación, por lo que comprueba periódicamente si hay cambios en los archivos, carga la versión alternativa en la memoria, y hace una comparación, la fusión de las diferencias.)
He aquí un fragmento interesante en el que se comparan los dos valores:
if (localObject.red != remoteObject.red) {
NSLog(@"Local red: %f Remote red: %f", localObject.red, remoteObject.red);
}
Esto es lo que veo en los registros:
2011-10-28 21:07:02.356 MyApp[12826:aa63] Local red: 0.205837 Remote red: 0.205837
extraño. ¿Derecha? ¿Cómo se está ejecutando este fragmento de código?
El valor real tal como se almacena en el archivo:
...red="0.205837"...
se convierte en un float
usando:
currentObject.red = [[attributeDict valueForKey:@"red"] floatValue];
En otro punto en el código yo era capaz de enganchar una captura de pantalla de GDB. Se imprimió a NSLog como: (Esta es también la precisión con la que aparece en el archivo en el disco.)
2011-10-28 21:21:19.894 MyApp[13214:1c03] Local red: 0.707199 Remote red: 0.707199
Pero aparece en el depurador como:
cómo es esto nivel de precisión que se obtiene en el nivel de propiedad, pero que no se almacena en el archivo ni se imprime correctamente en NSLog? ¿Y por qué parece variar?
Podría haber encontrado algo aquí, pero no apareció en ninguna búsqueda anterior desafortunadamente: http://stackoverflow.com/questions/5024913/issue-with-float-and-double-data-types-in- objetivo-c/5025021 # 5025021 –
¿Lo está convirtiendo a/de una cadena en cualquier punto? Si es así, use '% + 0.16f' en lugar de'% f'. O cualquiera que sea la precisión que desee en lugar de '.16'. Si no, ignore este comentario). – chown
Sí, estoy convirtiéndolo absolutamente en/desde un NSString. Sin embargo, había asumido que al crearlo: ** [NSString stringWithFormat: @ "% f", 0.707199f] ** y luego convertirlo como: ** [... floatValue] ** daría como resultado el mismo valor. Supongo que no. Gracias por el consejo, imagino que eso aclarará las cosas. Siéntase libre de publicarlo como una respuesta. –