2013-06-28 45 views
0

我想將浮點數轉換爲字符串。我知道你可以使用ostringstream & sprintf等,但在我正在工作的項目中,我正在嘗試使用我自己的函數只有(我正在創建自己的字符串類而不使用任何外部函數)。我不想要一個完美的表示,例如如果這種情況發生在大數或小數字上,我不介意:1.0420753e + 4與標準串流一樣。我知道浮點數是如何工作的(例如符號,指數,尾數),以及它們是如何以不同的方式表現出來的(這就是它的難點)。我知道這是可能的,因爲std C++庫可以做到這一點 - 我只是不知道該怎麼做我自己C++將浮點數轉換爲字符串

編輯:我已經創建了我自己的整數版本(將int轉換爲我自己的CString類)。

回答

4

首先,你自己不要這樣做。 iOS具有用於格式化浮點對象的標準C++功能,我希望Android也可以。

二,不要自己做這個。沒有舍入錯誤很難做到。這樣做的技術已經知道並且已經發布,你應該使用好的引用,而不是你在堆棧溢出中通常會找到的算法。這篇經典論文是Correctly Rounded Binary-Decimal and Decimal-Binary Conversions by David M. Gay,這裏是code from David Gay

+0

我其次+1。我的回答是幼稚的。 – Bathsheba

0

使用ostringstream - :

double d = 2.7818; 
std::ostringstream ss; 
ss << d; 
std::cout << ss.str() << std::endl; 
+0

「我知道你可以使用ostringstream&sprintf等來完成它,但是在我正在使用的項目中,我正在嘗試使用我自己的函數來完成它」。爲什麼立即建議'ostringstream'當它正好是*不*使用它...? – JBL

0

嗯,如果你真的想重塑自己的方輪,則可能是最簡單的方法是從浮子INT寫轉換器(你說你知道的位模式的工作原理),或者甚至可以是2個整數 - 其中一個用於小數部分,其他用於其餘部分,然後打印它們已存在的REUSING代碼

+0

我試圖編寫自己的代碼的原因是因爲我想將我的項目移植到iOS和Android,我希望儘可能減少依賴關係(是移動平臺上的標準C++庫嗎?) – hddh

+0

您絕對可以假設基本C功能可用,所以sprintf'ing是你最好的選擇。 Basic stl(即stringstream)也應該在那裏,但你最好檢查。但絕對不要自己編寫這樣的低級代碼!這就是你應該問自己的問題 - 在移動平臺上可以使用X功能。你絕對可以從那裏谷歌你的方式。 – aryjczyk

1

簡單方法:除以10直到值爲≤1.這會給出小數位數之後你應該打印.。將.後的每個數字乘以原始數字10,並循環。將生成的整數字符串化,並插入.

+0

+1這很可愛,並且如果浮點基數爲10,則可能是精確的。 – Bathsheba

+1

此方法有四捨五入錯誤。 –

+0

哦,顯然。我認爲這個問題是可以的。 – MSalters