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应该很简单,但是需要注意下面几个问题:
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
    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;
}

你可能感兴趣的:(【程序员编程艺术】学习记录,#数据类型的转换#)