2016-07-05 6 views
-1

Explication Pourquoi est-ce pas un double de cette Q pointue & A !:

j'ai rencontré ce problème en ce qui concerne la mise en œuvre mineure Objective-C et le type NSNumber a varier la précision en virgule flottante et Je devais juste savoir ce qui se passe vraiment et que dois-je faire pour résoudre ce problème. Cela pointé Q & A ne suffit pas à ma question avec sa réponse.NSNumbers et sa représentation valeur problème

Remarque: Cela ne concerne pas l'utilisation des types pour les valeurs. J'ai été troublé de comprendre le comportement de NSNumbers.

J'ai cette méthode très simple qui utilise essentiellement NSNumber:

+ (NSNumber*)addNumber:(NSNumber*)firstNumber withSecondNumber:(NSNumber*)secondNumber { 
    NSNumber *result = [NSNumber numberWithDouble:([firstNumber doubleValue] + [secondNumber doubleValue])]; 
    NSLog(@"Result: %@", result); // This will print out our result for testing 
    return result; 
} 

Donc, si j'appelle cette méthode avec des paramètres comme suit:

[Fundamentals addNumber:[NSNumber numberWithDouble:5.0] 
     withSecondNumber:[NSNumber numberWithDouble:3.5]]; 

Sortie imprimée: 8,5 ---> Mais ce que j'attendais

Mais si j'appelle cette méthode avec les paramètres suivants:

[Fundamentals addNumber:[NSNumber numberWithDouble:50.0] 
     withSecondNumber:[NSNumber numberWithDouble:36.54]]; 

Il imprime sur les éléments suivants: 86,53999999999999 ---> Ce qui me trouble et encore m'a étonné et questions que mon cerveau jusqu'à ce que ça fait mal! :(

Note:. Non seulement lors de l'impression, même Débogueur aussi montre la représentation de valeur telle qu'elle est imprimée au-dessus

quelqu'un peut-il expliquer cette s'il vous plaît

Merci à l'avance

!
+1

http://floating-point-gui.de/ – jtbandes

+0

Avez-vous essayé d'utiliser [NSString stringWithFormat: @ "%. 1f", YourDoubleNumber]? Devrait résoudre votre précision – OhadM

+0

Nope! En fait, je ne veux pas formater la sortie en tant que chaîne. J'ai besoin que la représentation de la valeur réelle soit naturelle! –

Répondre

0

Pour le format numérique de flotteur, vous pouvez utiliser NSNumberFormatter

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 

[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setMaximumFractionDigits:2]; 
[formatter setRoundingMode: NSNumberFormatterRoundUp]; 

NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:22.368511]]; 

NSLog(@"Result...%@",numberString);//Result 22.37