Domanda

Ho un piccolo problema e non riesco a trovare una soluzione!

Il mio codice è (questo è solo un esempio di codice, ma il mio codice originale fare qualcosa di simile):

float x = [@"2.45" floatValue];


for(int i=0; i<100; i++)
    x += 0.22;

NSLog(@"%f", x);

l'uscita è 52,450,001 mila e non 52,450 mila!

Non so perché questo accade!

Grazie per qualsiasi aiuto!

~ ~ RISOLTO

Grazie a tutti! Sì, ho risolto con il tipo doppio!

È stato utile?

Soluzione

I galleggianti sono una rappresentazione numero con una certa precisione. Non ogni valore può essere rappresentato in questo formato. Vedi qui pure.

Si può facilmente pensare perché questo sarebbe il caso: c'è un numero illimitato di numero proprio nel Intervallo (1..1), ma un galleggiante ha solo un numero limitato di bit per rappresentare tutti i numeri (- MAXFLOAT..MAXFLOAT).

Più giustamente messo: in una rappresentazione integer a 32 bit v'è un numero numerabile di numeri interi di essere rappresentati, ma v'è un innumerevole numero infinito di valori reali che non possono essere pienamente rappresentati in una rappresentazione limitata di 32 o 64 bit. Quindi non solo c'è un limite al più alto e il più basso valore reale rappresentabile, ma anche per la precisione.

Quindi, perché è un numero che ha poco cifre dopo la virgola mobile influenzato? Poiché la rappresentazione si basa su un sistema binario invece di un decimale, rendendo altri numeri facilmente rappresentato poi quelle decimali.

Altri suggerimenti

Numeri in virgola mobile non possono sempre essere rappresentati facilmente da computer. Questo porta ad imprecisioni in alcune cifre.

E 'come me che ti chiede cosa 1/3 è in decimale. Non importa quanto duramente si tenta, non si sta andando ad essere in grado di dirmi quello che è perché decimale non può descrivere con precisione quel numero.

I galleggianti non si può descrivere con precisione alcuni numeri decimali.

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