Попробуйте что-то вроде этого.
BOOL requiresExtraPrecision (double num) {
double roundedToHundredth = round(num * 100.0) / 100.0;
double diff = num - roundedToHundredth;
if (diff < 0) diff = 0.0 - diff;
if (diff < 0.0000001) {
return NO;
} else {
return YES;
}
}
NSString *formatted (double num) {
if (requiresExtraPrecision(num)) {
return [NSString stringWithFormat:@"%F", num];
} else {
NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setMaximumFractionDigits:2];
[formatter setMinimumFractionDigits:2];
return [formatter stringFromNumber:[NSNumber numberWithDouble:num]];
}
}
Как писал @Carl в комментарии к вопросу, сложная часть решает, когда двойному элементу нужна вся его точность.В этом коде я предполагаю, что если двойное число «достаточно близко» к округленному числу (в пределах миллионной доли), то мы должны просто отобразить округленное число.
Возможно, вы решите сделать его более строгим (на миллиард?), но вы всегда должны будете использовать какое-то приближение, потому что некоторые десятичные числа не могут быть сохранены точно как число с плавающей точкой.Несмотря на то, что пользователь мог ввести «0,1» во время ввода, эта информация теряется, когда число сохраняется как число с плавающей запятой.
Итак, учитывая, что у вас будет число с плавающей запятой, которое очень близко к десятичному, ноне совсем верно, вам придется решить, когда вы думаете, что число с плавающей точкой "достаточно близко" к десятичному числу.
Если вам нужна абсолютная точность (если вы работаете с деньгами!), тогда вам следует рассмотреть возможность использованияNSDecimal или NSDecimalNumber вместо числа с плавающей запятой.