2013-07-15 85 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; 

當我打印X我得到「0.10000000149」,這顯然是錯誤的。有什麼想法嗎?

+4

考慮'std :: stof'。這絕不是「明顯錯誤」。浮點數字並不準確。 C++也沒有任何類型的'decimal'類型。 – chris

回答

2

single-precision浮點數據類型精確到大約8-9位十進制數字。你用12位數字打印它,所以你可以預期最後三個數字是關閉的。

之所以有什麼不同之處在於1/10不能完全表示爲二進制小數;有幾十個問題在這個網站上有關於這個問題的很好的答案。最接近1/10的單精度值恰好是0.100000001490116119384765625。

+1

我開始討厭花車。我真的是。 – mjr

+0

@mjr所以使用雙打。 :P – Casey