簡體   English   中英

雙精度到字符串的轉換,具有固定的精度,並且沒有尾隨零

[英]double to string conversion with fixed precision and no trailing zeros

我必須通過在點后使用指定的位數將double值轉換為string 但是,我必須避免打印尾隨零,因此,如果doubleValue95 ,我希望看到的是"95"而不是"95.000000..." ,同樣,如果值是95.5 ,我希望看到的是"95.5"而不是"95.500000..."

這是我當前的代碼,使用boost::format

double doubleValue = ...;
std::string fmt = (boost::format("%%.%df") % opts.floatPrecision).str();
return (boost::format(fmt) % doubleValue).str();

但是,它不能處理我提到的兩種特殊情況(不打印尾隨零,在int情況下不打印點)。

我想我可以從字符串中刪除所有結尾的零,最后刪除結尾的點(如果有)。

但是我問是否有更聰明的方法可以做到這一點。

這是我所做的:

std::string fmt = (boost::format("%%.%df") % opts.floatPrecision).str();
std::string s = (boost::format(fmt) % doubleValue).str();
int len = s.length();
while(s[len - 1] == '0') len--;
if(s[len - 1] == '.') len--;
return s.substr(0, len);

注意:使用boost不是強制性的,但是由於我已經在項目中使用了boost,因此它很方便。

考慮到嘗試使用十進制格式表示二進制浮點類型的所有問題,如果您是我,我將采用以下方案:

  1. 使用您喜歡的格式出示你的字符串表示double ,四舍五入到DBL_DIG - 1顯著數字(讓格式化做到這一點,而不是四舍五入的double數字)。

  2. 自己在小數點分隔符后修剪多余的0

您可能會發現這難以置信,但是您的要求相當特殊。

暫無
暫無

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

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