2011-01-18 5 views
1

Dans mon code, j'utilise float pour calculer les devises, mais l'arrondi a donné des résultats non désirés, donc j'essaye de tout convertir en int. Avec aussi peu de changements à l'infrastructure que possible, dans mes fonctions d'initialisation, je l'ai fait:iPhone/C: Pourquoi convertir float en int: (int) float * 100 ne fonctionne pas?

-(id)initWithPrice:(float)p; 
{ 
[self setPrice:(int)(p*100)]; 
} 

je multiplie par 100 b/c dans la section principale, les valeurs sont données à titre .xx à 2 décimales. Je remarque anormalement que pour float 1.18, l'int arrondit à 117. Est-ce que quelqu'un le sait? Le flotteur le laisse comme 1.18. Je m'attends à ce que ce soit 118 pour l'équivalent en cents.

Merci.

+1

Si possible, j'essayerais d'utiliser NSDecimalNumber au lieu de floats pour stocker des valeurs de devise. – GriffeyDog

Répondre

4

Le point flottant est toujours un peu imprécis. Avec le codage en virgule flottante IEEE, les puissances de deux peuvent être représentées exactement (comme 4,2,1,0.5,0.25,0.125,0.0625, ...), mais les nombres comme 0.1 sont toujours une approximation (essayez de le représenter comme une somme des pouvoirs de 2).

Votre (int) cast tronquera tout ce qui entrera, donc si p * 100 se résout à 117.9999995 en raison de cette imprécision, cela deviendra 1.17 au lieu de 1.18.

Une meilleure solution consiste à utiliser quelque chose comme roundf sur p * 100. Mieux encore, si vous pouvez aller en amont et entièrement convertir en mathématiques à virgule fixe en utilisant des entiers dans l'ensemble du programme.

+4

Ou pour faire court: n'utilisez jamais «float», «double» ou «long double» quand vous traitez avec de l'argent. Déjà. –

+0

Amen à ça! À moins que vous n'ayez volontairement biaisé l'arrondi pour mettre le delta dans votre propre compte bancaire. – Nils

+0

OK. Merci. Ce n'est pas 117.99999999995 car dans mon code, l'init est quelque chose comme ceci: Item * item = [[Item alloc] initWithPrice: 1.18] et quand je fais NSLog (% f,% i) pour la version float et la version int, Je reçois 1,18 pour float et 117 pour int. J'ai augmenté les commentaires ici mais techniquement ce n'est pas une réponse. Si quelqu'un a une réponse, je la marquerai comme telle. – okysabeni