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这样的库。