使用ostringstream格式化double到string

Vio*_*ffe 3 c++ stringstream number-formatting

我想将double转换为字符串,在点之后舍入到2位小数.我希望1.009表示为"1.01",1.0表示为"1".这就是我尝试过的:

std::ostringstream oss;
oss << std::fixed << std::setprecision(2) << std::noshowpoint  << 1.0;
Run Code Online (Sandbox Code Playgroud)

它输出"1.00",即使我从未设置宽度甚至指定std::noshowpoint.如何实现理想的表示?

Ton*_*roy 5

最佳方案:

inline double twodec(double n) { return floor(n * 100 + 0.5) / 100; }

oss << twodec(1.0) << ' ' << twodec(1.009);
Run Code Online (Sandbox Code Playgroud)

讨论

来自http://www.cplusplus.com/reference/ios/fixed/(italics mine)

当floatfield设置为fixed时,浮点值将使用定点表示法写入,这意味着该值在精度字段指定的馏分部分中使用完全相同的数字表示,并且没有指数部分.

所以,"修复"不会起作用.

也就是说,我能想到做你想做的事的唯一方法是:

  • 首先将数字四舍五入到所需的精度(即floor(n * 100 + 0.5) / 100),然后使用默认表示(即不指定固定或科学或精确 - 如果fixedscientific有效,首先清除它们std::cout.unsetf(std::ios::floatfield)).
  • 根据您希望在点之前和之后看到的最大数字总数(精度指定的值)动态设置精度; 要做到这一点,你可以计算出小数点前的部分有多少位数(也许使用日志基数10)并加2
  • 将结果传输到a ostringstream,然后删除尾随0和任何'.' (非常可怕).