2013-07-15 3 views
0

Я использую следующий код для преобразования строк ввода поплавка:istringstream не разбор правильно

template <typename T> 
T parseString(const std::string &s) 
{ 
    T val; 
    std::istringstream is(s.c_str()); 
    is >> val; 

    return val; 
} 

float x = parseString<float>("0.1"); 
std::cout << std::setprecision(12) << x; 

При печати х я получаю «0.10000000149», которая, очевидно, неправильно. Есть предположения?

+4

Рассмотрите 'std :: stof'. И это никоим образом не «очевидно неправильно». Номера с плавающей запятой просто не точны. C++ также не имеет никакого типа 'decimal'. – chris

ответ

2

Тип данных float single-precision является точным до 8-9 десятичных цифр. Вы печатаете его с 12 цифрами, поэтому вы можете ожидать, что последние три будут выключены.

Причина, по которой существует какая-либо разница, заключается в том, что 1/10 не может быть представлен точно как двоичная дробь; есть десятки вопросов с отличными ответами на этом сайте об этой проблеме. Значение единственной точности, ближайшего к 1/10, составляет ровно 0,100000001490116119384765625.

+1

Я начинаю ненавидеть поплавки. Я действительно. – mjr

+0

@mjr Так используйте удвоения. :П – Casey

Смежные вопросы