NSNumberFormatter w/ currency и NSDecimalNumber; $9,95 == 9,949999999999999
Я использую NSNumberFormatter, чтобы получить значение объекта строковой валюты. Независимо от того, какую комбинацию настроек я пробую, я всегда получаю странные ошибки точности.
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
[numberFormatter setGeneratesDecimalNumbers:YES];
[numberFormatter setMaximumFractionDigits:2];
[numberFormatter setMinimumFractionDigits:2];
[numberFormatter setRoundingIncrement:@(0.01)];
NSDecimalNumber *value;
[numberFormatter getObjectValue:&value forString:@"$9.95" errorDescription:nil];
NSLog(@"value is %@ class %@", value,[value class]);
Производит:
2014-08-03 19:25:17.640 Test[50776:60b] value is 9.949999999999999 class NSDecimalNumber
Похоже, что minFractionDigits, maxFractionDigits и roundingIncrement релевантны только в контексте форматирования значения в строку, а не преобразования строки в число. Что еще более озадачивает меня, так это то, что NSNumberFormatter использует NSDecimalNumber, который должен избегать подобных проблем с точностью.
Я что-то упускаю здесь совершенно очевидно?