首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ 小数 转 字符串,该如何处理

2012-12-30 
C++ 小数 转 字符串功能: 要把一个小数转成 string 输出 , 小数可以超过20位或更多类似 QT中的 QString::n

C++ 小数 转 字符串
功能: 要把一个小数转成 string 输出 , 小数可以超过20位或更多   类似 QT中的 QString::number函数
自己写了个函数 本来想 用 stringstream 来做 可以如果把 0.000000000000000000000001 输入到stringstream流中 却编程了科学计数 达不到效果。

希望大侠们给点意见 , 小弟不生感谢!

代码:
#include <iostream>
#include <string>
#include <stack>
#include <QString>

std::string ToString(const double &input)
{
    //return boost::lexical_cast<std::string>(input);
    return std::to_string((long double)input);
}

std::string ToString(const double &input, const int &precision)
{
    return QString::number(input, 'f', precision).toStdString();
}


static string ItoString(long double value, int precision = 3)
{
    ostringstream out;
    char DECIMAL_POINT = '.';
    int prec =  numeric_limits<long double>::digits10;
    out.precision(prec);//覆盖默认精度
    out<<value;

    string str = out.str(); //从流中取出字符串
    size_t n = str.find(DECIMAL_POINT);
    string::size_type len = str.size();
    if ((n != string::npos) && (len > (n + precision)))
    {
        str[ n + precision] = '\0';//覆盖第一个多余的数
        str.swap(string(str.c_str()));//删除nul之后的多余字符

        return str ;
    }
    else if((n != string::npos) && len < (n + precision))
    {
        string st;
        for(int i = 0; i< precision - len ; ++i)
            st.push_back('0');

        return (str + st);
    }
    else if(n == string::npos)// value是个整数
    {
        string st(".");
        for(int i = 0; i<precision - 1 ; ++i)
            st.push_back('0');

        return (str + st) ;
    }
    return str;
}

double RoundOff(double num, int n)
{
    if(n < 0)
        return num;
    if(n>=  5)
        n = 5;

    double unit = 0.5;
    int begin = 1;

    for(int i = 0; i<n ; ++i)
    {
        unit *= 0.1;


        begin *= 10;
    }

    return ((int)((num + unit)*begin))/(begin * 1.0);
}


int main(int argc, char* argv[])
{
    //thread t1(Write, 20);
    //thread t2(Read, 30);

    //t1.join();
    //t2.join();

    while(true)
    {
       cout<<"------------------------------------------------------"<<endl;
       cout<<"请输入数字:"<<endl;
       long double d = 0;
       cin>>d;
       cout<<"请输入精度:"<<endl;
       int n = 0;
       cin>>n;
       cout<<"四舍五入:"<<RoundOff(d, n)<<endl;
       cout<<"转字符串(标准库):"<<std::to_string(d)<<endl;
       cout<<"转字符串:"<<ItoString(d, n + 1)<<endl;
       cout<<"先四舍五入后转字符串(标准库):"<<std::to_string((long double)RoundOff(d, n))<<endl;
       cout<<"先四舍五入后转字符串:"<<ItoString(RoundOff(d, n),n + 1)<<endl;
       cout<<"QT :"<<ToString(d, n)<<endl;
    }

    return 0;
}


[解决办法]
搜索下类似Decimal这样的库。

[解决办法]
搜索下类似Decimal这样的库。

热点排行