Вы не должны все время конвертировать между двойными и строковыми значениями, так как это имеет тенденцию терять точность (в общем, вы должны быть очень осторожными , если не хотите терять точность).
Например, nextafter(1.0,2.0)
возвращает наименьшее двойное число больше 1 (ровно 1.0000000000000002220446049250313080847263336181640625, но мы довольны 1.0000000000000002).Форматирование с помощью «% g» просто возвращает «1».
Мы ожидаем, что NSNumber сделает все правильно, но [[NSNumber numberWithDouble:nextafter(1,2)] stringValue]
также вернет «1».Согласно документам, -[NSNumber stringValue]
вызывает [self descriptionWithLocale:nil]
, который форматирует его как "% 0.16g".Этого не достаточно.Мы получаем правильный ответ, отформатировав с "% .17g".Я думаю, что "% .17g" достаточно при условии, что двойники - это 64-разрядные двойники IEEE 754, а библиотеки работают нормально, но нет гарантии.
В конце концов, нет гарантии, что [[NSString stringWithFormat:@"%.17g",n] doubleValue] == n
.