我遇到了一些我從未見過的東西,並且非常想知道發生了什麼。我正在試圖將double加2位小數,並將該值轉換爲一個字符串。演員完成後,事情對我發瘋。將浮點(雙精度)鑄造成字符串
下面是代碼:
void formatPercent(std::string& percent, const std::string& value, Config& config)
{
double number = boost::lexical_cast<double>(value);
if (config.total == 0)
{
std::ostringstream err;
err << "Cannot calculate percent from zero total.";
throw std::runtime_error(err.str());
}
number = (number/config.total)*100;
// Format the string to only return 2 decimals of precision
number = floor(number*100 + .5)/100;
percent = boost::lexical_cast<std::string>(number);
return;
}
我沒有得到完全是我預料,所以我做了一些調查。我做了以下內容:
std::cout << std::setprecision(10) << "number = " << number << std::endl;
std::cout << "percent = " << percent << std::endl;
...並得到如下:
number = 30.63
percent = 30.629999999999999
我懷疑升壓正在做一些有趣的事情。有沒有人有任何見解?
說真的,這有多奇怪?!?我要求一個雙精度的10位精度,並獲得4位數字。我要求將這4位數字轉換成一個字符串,並將其弄亂。到底是怎麼回事?
是時候另一個鏈接到什麼每臺計算機科學家應該知道關於浮點運算:http://download.oracle.com/docs/cd/E19957-01 /806-3568/ncg_goldberg.html –
您的鏈接根本無法解決我的問題。這其實只是一種迂迴的回答我的問題的方式。你會注意到Martin Beckett的回答直接回答了這個問題。 – Rico
二進制的30.63的擴展是無限的,正如基數10中1/3的擴展是無限的。詞法鑄()做它應該是因爲數字真的不是30.63。請參閱http://stackoverflow.com/questions/5016464/boostlexical-cast-conversion-double-to-string-c –