2009-09-02 6 views
4

J'ai un CGFloat mais j'en ai besoin en tant que NSInteger. La valeur float est comme 2.0f, donc je ne me soucie pas des parties fractionnaires et perdre de la précision. Qu'est-ce qu'un moyen légal de convertir en NSInteger sans problème (sauf la perte de précision, bien sûr)?Comment créer en toute sécurité un NSInteger à partir d'un CGFloat?

NSInteger niceInt = niceCGFloat; 

semble trop simple, sent bogué. Peut-être que vous pouvez expliquer?

Répondre

6

Il y a toujours le risque que 2.0f soit réellement 1.9999999999f lorsqu'il est représenté en binaire. Votre conversion en int conduirait alors à 1 au lieu de 2.

Pour éviter cela, j'ajouterais 0.5f à votre valeur flottante. Cela aurait également pour effet d'arrondir votre flottant, au lieu de le tronquer.

NSInteger niceInt = niceCGFloat + 0.5f;

7

Vous voulez que la fonction c lrintf() qui arrondit un point flottant à un long int.

Questions connexes