代码之家  ›  专栏  ›  技术社区  ›  Ganesh M

将双精度转换为固定宽度的字符串

  •  2
  • Ganesh M  · 技术社区  · 17 年前

    我想把一个双精度的转换成固定宽度的字符串。

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

    例如,如果值=102.121323435345,宽度为10,则该值应为,

    position==>        0123456789       
               value = 102.121323
    

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

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

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

    setw保证值的最小宽度,如果值大于宽度大小,则不会舍入值。

    谢谢。

    3 回复  |  直到 17 年前
        1
  •  3
  •   Serge    17 年前

    你可以用 osteram::width 和 ostream::precision 实现目标的功能,如下所示

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

        2
  •  2
  •   Community Mohan Dere    9 年前

    词汇转换如何?

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

    这不完全是你要的。我只是想跳出框框思考。
    differences between C and C++ 看看 Boost Format Library

        3
  •  1
  •   Community Mohan Dere    9 年前

    这就是你想要的吗?在这里,我们计算可用精度的数量并相应地设置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
    

    顺便说一句,如果你想要一卡车的计算方法 , here's how.