J'ai une méthode qui reçoit un float
comme argument, et vérifie si ce flottant est dans un tableau. Pour ce faire, je convertis d'abord le flotteur en NSNumber
. Ceci est une simplification testable de mon code:Vérification si un tableau contaisObject: @ (float) dans Objective-C peut retourner de façon inattendue NO
float aFloat = 0.3;
NSNumber *aNSNumber = @(aFloat);
NSArray *anArray = @[@(0.0), @(0.3), @(1.0)];
NSLog(@"%d", [anArray containsObject:aNSNumber]);
Ce code consignera 0
(à savoir NO
), il est donc dire que 0.3
est pas anArray
. Si aFloat
est un nombre "rond" tel que 0.0
, 0.5
, ou 1.0
, le test fonctionne et enregistre 1
(c'est-à-dire YES
). Tout nombre autre que celui-ci, comme le 0.3
ci-dessus, échoue.
D'autre part, si nous changeons aFloat
pour être un double
, cela fonctionne. Ou, si nous changeons anArray
à ceci:
NSArray *array = @[[NSNumber numberWithFloat:0.0], [NSNumber numberWithFloat:0.3], [NSNumber numberWithFloat:1.0]];
Il fonctionne également. Ce que je suppose, c'est que la notation NSNumber @()
crée un numberWithDouble:
. Mais, ma question est, ne devrait pas fonctionner même lorsque aFloat
est un float
? Comme je le "convertis" de toute façon en l'enregistrant dans aNSNumber
... Et ne devrait-il pas automatiquement reconnaître que le float
0.3
et le double
0.3
sont réellement les mêmes numéros? Aussi, pourquoi les chiffres "ronds" fonctionnent quand même?
float et double ne sont pas du même type, alors pourquoi NSNumber aurait-il la peine de les hacher comme le même type? – CodaFi
@CodaFi car après que je les ai créés, ils devraient tous être le même NSNumber. À mon avis, peu importe comment vous avez créé le NSNumber - ils représentent le même nombre "réel" (0.3 dans ce cas), donc le NSNumber créé avec le "float" 0.3 devrait être le même que le NSNumber créé avec le 'double' 0.3. Ils ne devraient être différentiables qu'après avoir obtenu leurs valeurs de NSNumber en utilisant 'floatValue' ou' doubleValue'. – glevco
Pourquoi diable utilisez-vous le flotteur et pas le double? N'utilisez jamais le flotteur - sauf si vous pouvez donner une bonne raison de le faire. Dans ce cas, ça vous a mordu dans le cul. Et pour le compilateur, votre opinion ne compte pas. Surtout quand tu as tort. – gnasher729