2013-08-26 120 views
0

說我有一個字符串作爲這樣的(其實我正從其他地方該值)的浮動字符串轉換爲浮動

std::string val = "2.31"; 

現在我做這樣的事情

float f = atof(val); 

現在f有像2.31xxxxxxxxxxx

任何建議我怎麼能得到小數點後兩個地方?使f看起來像2.3100000 ...

+0

'f'絕對不是「類似2.3131333e-xx的東西」。 –

+3

你在用什麼編譯? 'atof'需要一個'const char *'。 –

+0

你是對的這是一個很大的數字沒有 – Rajeshwar

回答

1

你永遠不會得到每個輸入的精確值。這是由於計算機中浮點的表示。這也是爲什麼你不能在浮動上做==。如果你想精確,你將不得不使用其他格式(BCD?)

+1

'1.0 == 1.0'就好了。 –

+2

@BenjaminBannier:「1.0」是一個輸入,而不是每個輸入。 –

+0

@BenjaminBannier讓我們同意,根據你的經驗,它似乎工作到目前爲止。 – 2013-08-26 18:23:14

0
template <typename T> 
T val(const std::string& s) 
{ 
    T x; 
    std::stringstream ss; 
    ss << s; 
    ss >> x; 
    return x; 
} 

int main() { 
float f =val<float>("2.31"); 
std::cout<<f; 
} 
+0

這個問題不會將「float」設置爲2.31。 –

+0

@EricPostpischil 2.31是[顯示](http://ideone.com/XBdQ21)兩位小數 – P0W

+0

問題標題表示需要轉換爲'float'。發送帶有兩位小數的數字輸出不會轉換爲「float」。您鏈接到的代碼中的實際「float」對象不具有2.31的確切值。 –

1

二進制浮點不能完全代表分數小數值。在大多數情況下,存儲在float中的值將是近似值。但是,如果使用的數字不超過std::numeric_limits<float>::digits10,則使用正確的打印算法將恢復原始數字。