2

我想将双精度转换为具有固定宽度的字符串。

如果宽度是 10,那么我希望双精度值四舍五入到这个宽度。

例如,如果 value = 102.121323435345 并且宽度是 10,那么这个值应该是,

位置==> 0123456789       
           值 = 102.121323

我可以用 snprintf 实现这一点,但我正在寻找一个 c++ 本机代码来做同样的事情。


char buf[125];
snprint(buf, width, "%.6f", value);

我尝试使用以下内容,但对我没有多大帮助,

 
std::ostringstream oss;
oss << std::fixed << std::setw(10) << std::precision(6) << value;

std::setw 保证值的最小宽度,如果值大于宽度大小,它不会对值进行四舍五入。

谢谢。

4

4 回答 4

3

您可以使用osteram::widthostream::precision函数来实现您的目标,就像这样

std::ostringstream out;
out.width(10);
out.precision(10);
out << 123.12345678910111213;

尽管它不会在点后添加零以尊重宽度,但它会在数字前添加空格(或您选择的任何字符)。因此,如果您将 102 作为输入值传递,您将得到 '102' 或 '0000000102' (如果您调用 out.fill('0');)而不是 '102.000000'。

于 2009-09-30T07:54:17.313 回答
2

词汇转换怎么样?

double x = 102.1213239999;
std::cout << boost::lexical_cast<std::string>(x).substr(0,10);

它不完全符合您的要求。我只是想跳出框框思考。
您可能还想查看这个问题以讨论C 和 C++ 之间的格式差异,并查看Boost 格式库

于 2009-09-30T06:03:46.367 回答
1

那是你要的吗?在这里,我们计算可用精度的数量并相应地设置 ostream。

    #include <iostream>
    #include <iomanip>

    using namespace std;

    int main(int argc, char* argv[])
    {
    // Input
    double value =  102.1213239999;
    // Calculate limits
    int digits = ( (value<1) ? 1 : int(1+log10(double(abs(value)))) );
    int width = 10;
    int precision = (((width-digits-1)>=0) ? (width-digits-1):0);

    // Display
    cout.setf(ios::fixed);
    cout.precision(precision);
    cout<<setw(10)<<value<<endl;


    return 0;

    }
    OUTPUT: 102.121324

顺便说一句,如果你想要一大堆计算数字的方法,这就是方法。

于 2009-09-30T05:05:27.533 回答
0
int main() {
    double x=3.543732;
    cout << to_string(x).substr(0,5);
    return 0;
}
于 2021-08-04T17:12:31.177 回答