double型转换成string型
double型转换成string型
题⽬描写叙述:
如有⼀个函数。其可接受⼀个long double參数,并将參数转换为字符串。结果字符串应保留两位⼩数,⽐如,浮点值123.45678应该⽣成“123.45”这种字符串。表⾯上看来这是⼀个意义不⼤的编程问题,然⽽。假设真要在实际中派上⽤场。函数应设计为具有⼀定弹性,以同意调⽤者指定⼩数位数。另外,函数也应该可以处理各种异常情况,如像123.0或123这种整数。
转换函数接⼝:string do_fraction(long double value, int decplaces = 3)
题⽬分析:
经验之谈:①不管何时须要格式化⼀个数值。都应该先转换为⼀个字符串,这样可保证每位数刚好占领⼀个字符。②须要转化为字符串时候,能够考虑使⽤库函数
使⽤库函数将long double值转化为⼀个string应该⾮常easy,可是须要注意以下⼏个问题:
1)精度问题
由于stringstream对象默认精度为6。(这⾥须要强调⼀个精度,⽼式指的是⼩数位数,新式应该指的是所有位数),这就会有出现⼀个问
题:假设很⼤的数,⽐如123456789.9,它就会转化为科学计数法,这显然不是我们须要的,所以我们使⽤库函数和转换之前,必须先把默认的精度设为最⼤
2)⼩数点位置问题
定位⼩数位使⽤string::find
在STL算法中使⽤⼀个常量来代表“数值未到”,字符串中是string::npos
由于我们设定了⼩数点最⼤位数decplacea。所以我们要检查⼩数点位数。假设⼩于它。那么直接返回字符串。否则⼩数部分多余的要被截去。
字符串截取小数点截断字符串的⽅法:通常使⽤\0
插⼊变量\0之后,怎样截去后⾯的字符。⼀般採⽤⾃交换
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
參考代码:
string do_fraction(long double value, int decplaces = 3)
{
ostringstream out;
int prec = numeric_limits::digits10; //18 注意须要加上头⽂件#include<limits>
out.precision(prec); //覆盖默认精度
//从流中取出字符串
string str = out.str();
//推断是否有⼩数点。且还有decpalces位
size_t n = str.find(DECIMAL_POINT);
if((n != string::npos) && (str.size() > n + decplaces))
{
str[n + decplaces] = '\0'; //覆盖第⼀个多余的数字
}
str.swap(string(str.c_str())); //删除NULL之后多余的字符
return str;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。