簡體   English   中英

在C ++中從雙精度字串連接到字符串時失去精度

[英]Losing precision when concatenating from a double to a string in C++

免責聲明:我是一名新的C ++程序員,但是我已經讀了很多有關浮點數之類的東西,以及一些數字如何不能正確存儲的知識。 在許多Google搜索中,我都找不到真正專門針對此問題的內容。

好的,基本上是標題所說的-當我將兩個雙精度變量連接到一個字符串中時,我遇到了一個問題,它們在每個變量號的末尾都放了一個小數。 我正在做的是讓用戶輸入兩個數字(以雙精度形式存儲)以進行一些計算,但是稍后在程序中,我需要將兩個數字都放在字符串中,以便可以在數組中搜索它們(已將值加載到)。 當這些數字連接成一個字符串時,它們會在兩個值中都刪除最后一位數字,這會引發搜索失敗(我進行了一些調試才能發現此問題)。

這是用戶為變量賦值后立即讀取的內容:

用戶1 = 43.5803481
user2 = -116.7406331

到目前為止,這些值都很好,這是我將它們連接起來后的樣子:

concat = 43.580348 -116.740633

如您所見,我在每個變量的末尾都失去了1。

這是我用來連接它們的代碼:

concat = to_string(user1) + " " + to_string(user2);

我已經將變量concat聲明為字符串和其他所有內容。

所以我想我想知道:
(1)為什么這樣做? (請參見編輯)
(2)如何解決? (是否有更好的方法?等)

在此先感謝您的關注!

編輯:我現在知道to_string只包含六個小數位,但是其他頁面上已鏈接的解決方案似乎無法解決我的問題。

我最終使用了下面的代碼,它完全滿足了我的需要-使用了一個double變量並將其更改為字符串,同時保持了精度。

注意:出於文檔目的,您需要在預處理器中包含#include <sstream>才能使此工作正常。

template <class T>
string num2str(const T& num, unsigned int prec = 8) 
{
string ret;
stringstream ss;


ios_base::fmtflags ff = ss.flags();
ff |= ios_base::dec;
ff |= ios_base::fixed;
ff |= ios_base::basefield;
ss.flags(ff);
ss.precision(prec);
ss << num;
ret = ss.str();
return ret;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM