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<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;
}

double型转换成string型,布布扣,bubuko.com

时间: 2024-07-30 20:20:06

double型转换成string型的相关文章

c++中double转换成string型(浮点数的格式化)

在日常编程中--包括对话框.关系数据库.金融程序.SMS程序及一切处理数据文件的程序,需要控制小数点后的小数位的情况非常普遍,本文中将要讲 解如何用简单的方法来控制小数位,另外,还要揭开字符串及数据精度的一点点小秘密. 问题的引出 如有一个函数,其可接受一个long double参数,并将参数转换为字符串,结果字符串应保留两位小数,例如,浮点值123.45678应该生成“123.45”这样的字符串.表面上看来 这是一个意义不大的编程问题,然而,如果真要在实际中派上用场,函数应设计为具有一定弹性,

C++中将string类型变量转换成int型变量

需要的头文件:#include<sstream> 操作: string s1="124": int x; stringstream ss; ss<<s1; ss>>x; C++中将string类型变量转换成int型变量,布布扣,bubuko.com

synchronized/java.util.concurrent.locks.Loc/如何格式化日期/将字符“12345”转换成long型

1.简述synchronized和java.util.concurrent.locks.Lock的异同?解答:主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放. 2.如何格式化日期解答:Date now=new Date();SimpleDateFormat sdf=new SimpleDate

sql 将8位字符串转换成日期型

将8位字符串转换成日期型,方法如下: SELECT CONVERT(varchar(10),CAST('20070405' AS datetime),120)

java使用格式String型转成Date型

public class TimeTwo { public static void main(String[] args) throws ParseException{ String s = "2018-08-12 12:02:23"; SimpleDateFormat g = new SimpleDateFormat("yyyy-MM-dd MM:mm:ss"); try{ Date h = g.parse(s);// System.out.println(h);

impala 四舍五入后转换成string后又变成一个double的数值解决(除不尽的情况)

impala 四舍五入后转换成string后又变成一个double的数值解决(除不尽的情况)例如Query: select cast(round(2 / 3, 4)*100 as string)+---------------------------------------+| cast(round(2 / 3, 4) * 100 as string) |+---------------------------------------+| 66.670000000000002 |+-------

Java 里把 InputStream 转换成 String 的几种方法

我们在 Java 中经常会碰到如何把 InputStream 转换成 String 的情形,比如从文件或网络得到一个 InputStream,需要转换成字符串输出或赋给别的变量. 未真正关注这个问题之前我常用的办法就是按字节一次次读到缓冲区,或是建立 BufferedReader 逐行读取.其实大可不必费此周折,我们可以用 Apache commons IOUtils,或者是 JDK 1.5 后的 Scanner,还可用 Google  Guava 库的 CharStreams.到了 JDK7,

Java 把 InputStream 转换成 String 的几种方法

我们在 Java 中经常会碰到如何把 InputStream 转换成 String 的情形,比如从文件或网络得到一个 InputStream,需要转换成字符串输出或赋给别的变量. 未真正关注这个问题之前我常用的办法就是按字节一次次读到缓冲区,或是建立 BufferedReader 逐行读取.其实大可不必费此周折,我们可以用 Apache commons IOUtils,或者是 JDK 1.5 后的 Scanner,还可用 Google  Guava 库的 CharStreams.到了 JDK7,

把Message转换成String

把Message转换成String注意,这里欠缺CM消息和CN消息,因为它们不是系统消息,不经过Dispatch API转发,但是可以把它们写在WndProc里,这样SendMessage送来的消息也可截获,或者Dispatch里,这样动态消息也可统统截获.另外就是要把VCL标准控件里,凡是改写了WndProc的子类也要截取,因为Windows会把消息发给它们,却不一定会调用TWinControl.WndProc函数(但大多数还是调用了,没准是全部).唯一不能截获的是子类出现了新消息,并且改写了