CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

怎么把小数后的零去掉?例:0.120000--->0.12

楼主xzx983(落叶)2006-07-27 15:39:02 在 C/C++ / C++ 语言 提问

我用ADO把数据库中的数值字段取出,却发现值中包含很多个零,怎么把尾部的0给去掉?  
  例如:把0.120000变成0.12?? 问题点数:20、回复次数:29Top

1 楼kevinmartin(海魂)回复于 2006-07-27 15:46:59 得分 0

用CString的Trim('0')Top

2 楼xzx983(落叶)回复于 2006-07-27 16:01:59 得分 0

那是不是要先把数值float转化为字符型,再Trim('0'),再传为float型?  
   
  那如果数据为0.00120000呢?10.001200呢?Top

3 楼corrupt(喜欢 睡在床板下 的思考)回复于 2006-07-27 16:55:34 得分 0

变成   字符串   ,再处理   。。。拙见Top

4 楼wanderfox()回复于 2006-07-27 17:03:39 得分 0

变字符串,反向,去掉前面的0,再反向,再变回来~Top

5 楼gongyuan()回复于 2006-07-27 18:18:30 得分 0

printf("%.2f\n",nF);这样输出行吗?Top

6 楼xzx983(落叶)回复于 2006-07-27 18:59:23 得分 0

to:   gongyuan  
          printf("%.2f\n",nF);这样输出行吗?  
       
  这样只能保留两位小数,不能把结尾的0去掉如:  
   
    nF=0.12300;   printf("%.2f\n",nF);   //=====>0.12  
    nF=0.1000;   printf("%.2f\n",nF);   //=====>0.10-----无法把这个零给去掉  
   
  我要效果是这样的是:  
  0.025600   ====>0.0256  
  0.120000======>0.12  
  0.0000250======>0.000025Top

7 楼leboy(秦天宇)回复于 2006-07-27 19:05:03 得分 0

你看直接输出不就可以了吗?Top

8 楼xzx983(落叶)回复于 2006-07-27 19:07:06 得分 0

不行,直接输出会有很多000Top

9 楼cghc(cghc)回复于 2006-07-27 20:30:09 得分 0

变字符串,反向,去掉前面的0,再反向,再变回来~  
  Top

10 楼cnhgj(戏子) (没时间练太极)回复于 2006-07-28 01:15:02 得分 0

cout<<0.025600<<endl;  
  cout<<0.120000<<endl;  
  后面的0没有输出啊。。Top

11 楼zyyoung(倡导开源)回复于 2006-07-28 10:03:50 得分 0

有没有限制浮点数精度的函数啊!!!Top

12 楼zyyoung(倡导开源)回复于 2006-07-28 10:04:07 得分 0

有的话,不就ok了  
  Top

13 楼Heaven_Redsky(火骑士)回复于 2006-07-28 10:24:33 得分 0

不知道领会了LZ的意思没有  
  double   a   =   1000.12000;  
  char   buffer[24];  
  char*   p;  
  int   i   =   0;  
   
  sprintf(buffer,   "%f",   a);  
   
  p   =   buffer;  
   
  while(*p   !=   '\0')  
  {  
  ++p;  
  }  
  while(*(--p)   ==   '0')  
  {  
  i++;  
  }  
   
  switch(6   -   i)  
  {  
  case   1:  
  printf("%.1f\n",   a);  
  break;  
  case   2:  
  printf("%.2f\n",   a);  
  break;  
  case   3:  
  printf("%.3f\n",   a);  
  break;  
  case   4:  
  printf("%.4f\n",   a);  
  break;  
  case   5:  
  printf("%.5f\n",   a);  
  break;  
  case   6:  
  printf("%.6f\n",   a);  
  break;  
  }Top

14 楼iorilchen()回复于 2006-07-28 10:25:06 得分 0

支持("%.2f)Top

15 楼lin_style(﹏.贾诩(某人语:矮子也高潮))回复于 2006-07-28 12:25:21 得分 0

怎么都用PRINT哦?  
   
  贴个这样的:  
  #include<iostream>  
  #include<iomanip>  
  using   namespace   std;  
   
  int   main()  
  {  
      double   a=22.0/7;  
      cout<<setprecision(0)<<a<<endl  
              <<setprecision(1)<<a<<endl  
              <<setprecision(2)<<a<<endl  
              <<setprecision(3)<<a<<endl  
              <<setprecision(8)<<a<<endl;     //控制输出浮点的个数,包括小数点。  
   
      cout<<setiosflags(ios::fixed)<<endl;  
      cout<<setprecision(8)<<a<<endl;     //   与SETIOSFLAGS一起用,控制小数点后的精度  
      return   0;  
  }  
   
  结果:  
  3.14286  
  3  
  3.1  
  3.14  
  3.1428571  
   
  3.14285714  
  Press   any   key   to   continueTop

16 楼lin_style(﹏.贾诩(某人语:矮子也高潮))回复于 2006-07-28 12:25:53 得分 0

SORRY。不是精度  
  是位数Top

17 楼Radar2006(中华英雄)回复于 2006-07-28 12:50:53 得分 0

要是在C#里面用正则表达式  
  Top

18 楼guo0084(alre)回复于 2006-07-28 12:59:50 得分 0

应该和你用的数据类型有关吧。呵呵Top

19 楼flowlight(流光)回复于 2006-07-28 13:09:30 得分 5

可以使用浮点数->字符串->浮点数来消除  
   
  CString   strFloat   =   "0.01200000";  
  strFloat.Format("%f",atof(strFloat));//   "0.01200000->   0.012  
   
  Top

20 楼pass86(l.jay)回复于 2006-07-28 13:39:33 得分 0

lin_style(冰邪)的方法测试成功,  
  Top

21 楼bzpscu(满天星)回复于 2006-07-28 14:24:48 得分 5

#include<iostream>  
  #include<iomanip>  
   
  void   TrimRightZero(char   *   psstr)  
  {  
   
  if   (psstr   ==   NULL)  
  return   ;  
   
  int   nLen   =   strlen(psstr);  
  while(   nLen   )  
  {  
  nLen   --   ;  
  if   (   psstr[nLen]   ==   '.')  
  {  
  psstr[nLen]   =   0;  
  break;  
  }  
  if   (   psstr[nLen]   ==   '0')  
  {  
  psstr[nLen]   =   0;  
  }else  
  {  
  break;  
  }  
  }  
  }  
   
  int   FloatFix(double   dx,char   *   strDest,int   nDestBufLen,int   nMaxFixBit   =   8)  
  {  
  int   FixBit   =   nMaxFixBit   ;  
  if   (   FixBit   >   16   )    
  {  
  FixBit   =   16   ;  
  }else   if   (   FixBit   <   0   )  
  {  
  FixBit   =   8   ;  
  }  
   
  if   (   nDestBufLen   <   FixBit   +   2)  
  {  
  return   -1;  
  }  
   
  char   pszFormat[32];  
  memset(pszFormat,0,sizeof(pszFormat));  
  sprintf(pszFormat,"%%.%df",FixBit);  
   
  sprintf(strDest,pszFormat,dx);  
   
  TrimRightZero(strDest);  
   
  return   0;  
  }  
   
  int   main()  
  {  
  double   a[3]   ;  
  a[0]   =   0.025600   ;  
  a[1]   =   0.120000   ;  
  a[2]   =   0.0000250   ;  
   
  char   dblstr[512];  
  for   (   int   i   =   0   ;   i   <   3   ;   i   ++)  
  {  
  memset(dblstr,0x00,sizeof(dblstr));  
  FloatFix(a[i],dblstr,sizeof(dblstr));  
  printf("[%.8f====>   %s]\r\n",a[i],dblstr);  
  }  
  return   0;  
  }  
  Top

22 楼DollfaceYY(杨洋 DollfaceYY.china-pub.com)回复于 2006-07-28 15:38:04 得分 5

#include   <Windows.h>  
  #include   <Tchar.h>  
   
  void  
  SignificantDigit(double   dNum,   TCHAR   szSignificantDigit[]);  
   
  int   _tmain(int   argc,   _TCHAR*   argv[])  
  {  
  TCHAR szBuf[64];  
   
  SignificantDigit(-01.0000,   szBuf);  
  puts(szBuf);  
   
  SignificantDigit(-1.025,   szBuf);  
  puts(szBuf);  
   
  SignificantDigit(5.333,   szBuf);  
  puts(szBuf);  
   
  SignificantDigit(000.0000,   szBuf);  
  puts(szBuf);  
   
   
  return   0;  
  }  
   
  //   ======================================================  
  //   功能:   获取有效数字  
  //   参数:   dNum:   [IN]   待求有效数字的数  
  //   szSignificantDigit:   [IN]   存放结果的空间  
  //   返回:   dNum的有效数字  
  //   备注:   无  
  //   ======================================================  
  void  
  SignificantDigit(double   dNum,   TCHAR   szSignificantDigit[])  
  {  
  double dResult;  
   
   
  //   ===   把数字转换为字符串   ===  
  _stprintf(szSignificantDigit,   TEXT("%f"),   dNum);  
   
  //   ===   小数部分   ===  
  TCHAR* p_tcTmp;  
  for   (p_tcTmp   =   szSignificantDigit   +   lstrlen(szSignificantDigit)   -   1;   (TCHAR)'.'   !=   *p_tcTmp;   --p_tcTmp)  
  {  
  if   ('0'   !=   *p_tcTmp)  
  break;  
  }  
  if   ((TCHAR)'.'   ==   *p_tcTmp) //   小数部分全为0  
  ++p_tcTmp;  
  *++p_tcTmp   =   '\0';  
  }Top

23 楼Assassin_zjl()回复于 2006-07-28 15:43:45 得分 0

用%.2f输出就行了Top

24 楼DollfaceYY(杨洋 DollfaceYY.china-pub.com)回复于 2006-07-28 16:27:08 得分 5

This   one   maybe   better   :)  
   
   
   
   
  #include   <Windows.h>  
  #include   <Tchar.h>  
   
  void  
  SignificantDigit(double   dNum,   TCHAR   szSignificantDigit[]);  
   
  int   _tmain(int   argc,   _TCHAR*   argv[])  
  {  
  TCHAR szBuf[64];  
   
  SignificantDigit(-01.0000,   szBuf);  
  puts(szBuf);  
   
  SignificantDigit(-1.025,   szBuf);  
  puts(szBuf);  
   
  SignificantDigit(5.333,   szBuf);  
  puts(szBuf);  
   
  SignificantDigit(000.0000,   szBuf);  
  puts(szBuf);  
   
   
  return   0;  
  }  
   
  //   ======================================================  
  //   功能:   获取有效数字  
  //   参数:   dNum:   [IN]   待求有效数字的数  
  //   szSignificantDigit:   [OUT]   存放结果的空间  
  //   返回:   无  
  //   备注:   无  
  //   ======================================================  
  void  
  SignificantDigit(double   dNum,   TCHAR   szSignificantDigit[])  
  {  
  //   ===   把数字转换为字符串   ===  
  _stprintf(szSignificantDigit,   TEXT("%f"),   dNum);  
   
  //   ===   找到最后一个有效数字的位置   ===  
  TCHAR* p_tcTmp;  
  for   (p_tcTmp   =   szSignificantDigit   +   lstrlen(szSignificantDigit)   -   1;   (TCHAR)'.'   !=   *p_tcTmp;   --p_tcTmp)  
  {  
  if   ('0'   !=   *p_tcTmp)  
  break;  
  }  
   
  //   ===   计算有效数字的位数   ===  
  DWORD dwCount;  
  dwCount   =   ((TCHAR)'.'   ==   *p_tcTmp   ?   0   :   p_tcTmp   -   _tcschr(szSignificantDigit,   (TCHAR)'.'));  
   
  //   ===   保存结果   ===  
  _stprintf(szSignificantDigit,   TEXT("%.*f"),   dwCount,   dNum);  
  }Top

25 楼slong42()回复于 2006-07-28 17:48:39 得分 0

输出的时候把他转成double型的可以么?Top

26 楼xylophone21(天堂的隔壁)回复于 2006-07-28 19:15:48 得分 0

有个问题没有人注意吗?  
  0.12000000  
  实际上很可能在内存中表现为0.120000000000000000001等样子?Top

27 楼xzx983(落叶)回复于 2006-07-28 20:10:20 得分 0

TO楼上的:  
  32的浮点数在内存中用前24位表示基数,后8位表示指数,其中,基数和指数的符号位各占用一位,也就是基数的有效数字最多是23位。你的例子中的最后一位也是有效的,会完整的输出:0.120000000000000000001Top

28 楼Heaven_Redsky(火骑士)回复于 2006-07-28 21:27:01 得分 0

刚才随便写了一个   不好意思    
  大家的态度让人佩服Top

29 楼xzx983(落叶)回复于 2006-07-29 11:30:36 得分 0

谢谢大家的关注,各位大大让我明白了。  
  小数在内存中尾部的零是无论如何都存在的,只是在Cout时不会显示出来:  
          double   a=0.012000;  
          cout<<a;=======>结果是0.012,这是cout处理的结果。  
   
  而CString   str;  
  str=BSTR(a);=====>str中会包含尾部的零。  
   
  再把str还给a时,在内存中尾部还是会有零的  
   
  我们在计算时没有必要去除尾部的0,只需在显示时把后面的0结去掉就行了,没有必要再变回来。  
   
   
  再次谢谢大家。Top

相关问题

关键词

得分解答快速导航

  • 帖主:xzx983
  • flowlight
  • bzpscu
  • DollfaceYY
  • DollfaceYY

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo