怎么把小数后的零去掉?例:0.120000--->0.12
我用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




