Преобразование NSString в число с плавающей запятой - добавляет в десятичных разрядах? - PullRequest
2 голосов
/ 17 февраля 2012

Я анализирую некоторую информацию о вершинах из файла XML, который выглядит следующим образом (частичное извлечение):

21081.7 23447.6 2781.62 24207.4 18697.3 -2196.96

Я сохраняю строку как NSString, а затем преобразую в значение с плавающей точкой (которое я позже передам в OpenGL ES)

NSString * xPoint = [finishedParsingArray objectAtIndex:baseIndex];
                 NSLog(@"xPoiint is %@", xPoint);

                 float x = [xPoint floatValue];

Проблема в том, что число с плавающей запятой x меняет значения следующим образом:

21081.699219, 23447.599609, 2781.620117, 24207.400391, 18697.300781, -2196.959961

Как видите, меняется число знаков после запятой (не знаете, как это происходит - должно быть скрытое форматирование в файле xml?)

У меня вопрос, как я могу сохранить число с плавающей точкой, чтобы исходное число в файле NSString / XML соответствовало тому же числу десятичных разрядов?

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 17 февраля 2012

Похоже, ваша проблема в том, что вы не понимаете, как floats хранится в памяти, и не знаете, что с плавающей точкой не точны .

Точные значения часто не могут быть сохранены , и поэтому система выбирает самое близкое число, которое она может представить. Если вы внимательно посмотрите, то увидите, что каждое из выведенных чисел очень близко к вашим введенным значениям.

Для большей точности попробуйте вместо этого использовать double. Double встречается с теми же проблемами, но с большей точностью. Поплавки имеют около 6 значащих цифр; двойники имеют более чем вдвое больше. Источник

Вот некоторые другие ответы StackOverflow и внешние статьи, которые вы должны прочитать:

2 голосов
/ 17 февраля 2012

Все примитивы, в которых хранятся числа с плавающей запятой, имеют проблему с точностью.Большую часть времени он настолько мал, что не имеет значения, но иногда это жизненно важно.

Когда важно сохранить точное число, я бы предложил использовать NSDecimalNumber .

...