2015-08-14 4 views
0

В моем проекте мне нужно прочитать некоторые числовые данные из XML-файла, использовать его и сохранить его на диске в другом каталоге.Точный std :: string to float conversion

Пропустив файл кожуру речь идет о проблеме std::string для float преобразования:

std::string sFloatNumber; 
float fNumber = std::atof(sFloatNumber); 

который работает нормально, но я заметил небольшие отклонения между значением, записанным в std::string и один за полученные после преобразования в float (о ~ 0,0001).

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

Так что я спрашиваю, есть ли какая-то конверсия между std::string и float, которая имеет точность 1: 1?

+1

Возможно, использование 'double' дает вам лучшую точность? –

+0

Можете указать, что вы имеете в виду с точностью «1: 1»? Не все десятичные числа могут быть точно представлены в двоичном формате с плавающей запятой. 9 мест после десятичной точки достаточно, чтобы зафиксировать полную точность 'float'. Но значение не всегда может быть точным. 0,1 не представляется в двоичном виде, как, например, 1/3 не представляется в виде десятичного числа. – Angew

+0

Номера с плавающей точкой по самой своей природе являются неконструктивными. – dandan78

ответ

1

Вы действительно не можете сделать преобразование более точным, чем то, что вы достигнете, используя для этого встроенные операторы. Причина в том, что float не может представлять все числа. То, что они могут представлять, - это число, самое близкое к тому, которое вы вводите, и я думаю, это то, что они показывают. Таким образом, нет возможности, чтобы вы могли преобразовать строку точно в float.

Если вы хотите получить больше точности, я предлагаю вам использовать double. Однако это также имеет предел точности, но гораздо лучше, чем плавать. Причиной этого является то, что double использует 64 бита для представления числа, тогда как float использует 32 бита. Но их метод хранения числа аналогичен, и поэтому применяются те же ограничения.