C开发教程:C中对浮点数的格式化显示.docx_第1页
C开发教程:C中对浮点数的格式化显示.docx_第2页
C开发教程:C中对浮点数的格式化显示.docx_第3页
C开发教程:C中对浮点数的格式化显示.docx_第4页
C开发教程:C中对浮点数的格式化显示.docx_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

达内教育中国IT培训领导品牌C+开发教程:C+中对浮点数的格式化显示在日常编程中-包括对话框、关系数据库、金融程序、SMS程序及一切处理数据文件的程序,需要控制小数点后的小数位的情况非常普遍,本文中将要讲解如何用简单的方法来控制小数位,另外,还要揭开字符串及数据精度的一点点小秘密。问题的引出如有一个函数,其可接受一个long double参数,并将参数转换为字符串,结果字符串应保留两位小数,例如,浮点值123.45678应该生成“123.45”这样的字符串。表面上看来这是一个意义不大的编程问题,然而,如果真要在实际中派上用场,函数应设计为具有一定弹性,以允许调用者指定小数位数。另外,函数也应该能够处理各种异常情况,如像123.0或123这样的整数。在开始之前,先看一下编写“优雅”C+代码时的两句“真言”:“真言”1:无论何时需要格式化一个数值,都应先转换为一个字符串。这样可保证每位数刚好占据一个字符。“真言”2:在需要转换为字符串时,请使用库。转换函数的接口非常简洁:第一个参数是需被格式化的数值;第二个参数代表小数点后显示的小数位,且应该具有一个默认值;返回值为一个string类型:string do_fraction(long double value, int decplaces=3);注意,第二个参数代表的小数位数中包括了小数点,因此,两位小数需要默认值为3。精度问题当然,第一步是把long double值转换为一个string,使用标准C+库简直是手到擒来。然而,有一件事情必须引起注意,因为某些原因,stringstream对象默认精度为6,而许多程序员错误地把“精度”理解为小数的位数,这是不正确的,精度应指代全部位数。因而,数字1234.56可安全地通过默认精度6来表示,但12345.67会被截断为12345.6。这样的话,如果你有一个非常大的数,如1234567.8,它的结果会静悄悄地转换为科学记数法:1.23457e+06,这显然不是我们想要的。为避免这样的麻烦,在开始转换之前,应把默认精度设为最大。为得到long double能表示的最大位数,可使用库:string do_fraction(long double value, int decplaces=3)int prec=numeric_limits:digits10; / 18ostringstream out;out.precision(prec);/覆盖默认精度out n+decplaces) /后面至少还有decplaces位吗?/在小数decplaces位之后写入nulstrn+decplaces=0; 最后一行覆盖了多余的小数位,它使用了0常量来截断字符串,要注意,string对象的数据可以包含nul字符;而字符串的实际长度由size()的返回值决定。因此,你不能假定字符串已被正确地格式化,换句话来说,如果在str中原来为“123.4567”,在插入0常量之后,它变成了“123.4507”,为把str缩减为“123.45”,一般可使用自交换的方法:str.swap(string(str.c_str() );/删除nul之后的多余字符那它的原理是什么呢?函数string:c_str()返回一个const char *代表此字符串对象,而这个值被用作一个临时string对象的初始化值,接着,临时对象又被用作str.swap()的参数,swap()会把值“123.45”赋给str。一些老一点的编译器不支持默认模板参数,可能不会让swap()通过编译,如果是这样的话,使用手工交换来代替:string temp=str.c_str();str=temp;代码虽不是很“优美”,但能达到目的就行。以下是do_fraction()的完整代码:string do_fraction(long double value, int decplaces=3)ostringstream out;int prec=numeric_limits:digits10; / 18out.precision(prec);/覆盖默认精度out n+decplaces) /后面至少还有decplaces位吗?strn+decplaces=0;/覆盖第一个多余的数str.swap(string(str.c_str();/删除nul之后的多余字符return str;如果不想通过传值返回一个string对象,还可增加一个参数,把str对象以引用传递:void do_fraction(long double value, string & str, int decplaces=3);从个人的角度来讲,还是倾向于让编译器做这样的优化,另外,使用传

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论