使用流在点后打印最大小数位数

时间:2012-11-01 22:48:31

标签: c++ stream

如何使用stringstream打印双倍数字点后的 max 小数位数(没有尾随零和没有舍入)?例如,如果我只想打印最多5位小数:

1 -> 1
1.23 -> 1.23
1.234 -> 1.234
1.2345 -> 1.2345
1.23456 -> 1.23456
1.234567 -> 1.23456
1.2345678 -> 1.23456
1230.2345678 -> 1230.23456 <- Demonstrating that I am not talking about significant digits of the whole number either

在我看到的所有工具(setw,setprecision,fixed等)中,我似乎无法想出这个。谢谢!

2 个答案:

答案 0 :(得分:1)

您是否绝对想要使用stringstream选项执行此操作?

您可以像这样编写round函数:

double round(double n, int digits) {
    double mult = pow(10, digits);
    return floor(n*mult)/mult;
}

然后只需打印round(1.2345678, 5)

答案 1 :(得分:0)

没有内置方法可以做到这一点(据我所知)。但是,如下所述的黑客攻击是可能的:

void print_with_places(double num, unsigned places) {
   for (double i = 1; i < num; i*=10) { //have to use a double here because of precision...
      ++places;
   }
   std::cout << std::setprecision(places) << num;
}

它不是最准确的,但它是或者将它打印到字符串然后操纵字符串。