Domanda

primo post qui. Avere un problema con il metodo floatValue di NSNumber - in qualche modo, restituisce un numero imprecisato. Ecco il problema: posso conservare un po 'di NSNumbers in una matrice, in questo modo:

NSArray *a = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0.04f],
    [NSNumber numberWithFloat:0.028f], 
    [NSNumber numberWithFloat:0.016f],
    [NSNumber numberWithFloat:0.004f],
   nil];

Poi cerco di recuperare il primo valore (per esempio): NSNumber n = (NSNumber ) [a objectAtIndex: 0]; CGFloat f = [n floatValue];

Nel debugger, n mostra un valore di 0,04 (nella colonna sintesi), ma F mostra un valore di ,0399,999991 millions. Che cosa sto facendo male qui?

Grazie a tutti.

È stato utile?

Soluzione

Non stai facendo niente di male. Questo non è un problema specifico di NSNumber o CGFloat, neanche. E 'qualcosa di molto universale sui numeri in virgola mobile, che si basa su poteri di 2, non potenze di dieci. Si consiglia di leggere questo articolo definitivo o Wikipedia articolo .

Il punto è, i numeri in virgola mobile standard possono solo rappresentare accuratamente un numero che è una somma di 1/2, 1/4, 1/8, .... 1/10 non è. Quindi non si può del tutto accuratamente rappresentare 0.1 utilizzando i numeri in virgola mobile standard.

Se si ha realmente bisogno di trattare il caso, ci sono le routine che si occupano di frazioni razionali o numeri in virgola mobile decimali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top