0

J'ai un petit problème et je ne trouve pas de solution!Problème avec les flotteurs dans Objective-C

Mon code est (c'est seulement un exemple de code, mais mon code d'origine quelque chose comme ça):

float x = [@"2.45" floatValue]; 


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

NSLog(@"%f", x); 

la sortie est 52,450001 et non 52,450000!

Je ne sais pas parce que cela arrive!

Merci pour toute aide!

~ ~ SOLVED

Merci à tous! Oui, j'ai résolu avec le double type!

+1

Le lien de Hanno explique le problème. Cet exemple particulier ne se produirait pas avec un double au lieu d'un flottant, mais le même défaut de base existe. – JimG

+0

Double cassera pour d'autres nombres, cependant. Essayez décimal. –

Répondre

6

Flotteurs sont une représentation numérique avec une certaine précision. Toutes les valeurs ne peuvent pas être représentées dans ce format. Voir aussi here.

Vous pouvez facilement penser à pourquoi ce serait le cas: il y a un nombre illimité de nombre juste dans l'intervalle (1..1), mais un flottant a seulement un nombre limité de bits pour représenter tous les nombres dans (-MAXFLOAT..MAXFLOAT). Plus précisément: dans une représentation d'entier 32 bits, il y a un nombre dénombrable d'entiers à représenter. Mais il existe un nombre innombrable infini de valeurs réelles qui ne peuvent pas être entièrement représentées dans une représentation limitée de 32 ou 64 bits. Par conséquent, il n'y a pas seulement une limite à la valeur réelle représentable la plus élevée et la plus basse, mais aussi à la précision.

Alors, pourquoi un nombre a-t-il de petits chiffres après que le point flottant a été affecté? Parce que la représentation est basée sur un système binaire au lieu d'un nombre décimal, rendant les autres nombres facilement représentés puis les nombres décimaux.

2

Les nombres à virgule flottante ne peuvent pas toujours être représentés facilement par les ordinateurs. Cela conduit à l'inexactitude dans certains chiffres. C'est comme si je vous demandais ce que 1/3 est en décimal. Peu importe comment vous essayez, vous ne serez pas en mesure de me dire ce que c'est parce que la décimale ne peut pas décrire avec précision ce nombre.

Les flottants ne peuvent pas décrire avec précision certains nombres décimaux.