C++ 中的数据怎样以浮点小数(而不是定点小数)输出,而不用科学计数法?

如题,C++ 中的数据怎样以浮点小数输出,而不用科学计数法,也不是用定点小数。
比如:
double dNum1=0.00003,dNum2=0.0006
cout<<dNum1; //屏幕显示3e-05,而不是0.00003
cout<<dNum2; //屏幕显示0.0006
用setiosflags(ios::fixed)可以控制定点小数格式,但使用后dNum2会输出0.00060,后面的0并不是需要的。
如果可以解答,追加分数,谢谢各位大神!
先谢谢各位。
其实我原本目的是将double转为长度有限制的string输出,但是要保持小数形态,当然如果有整数的话当然也要正常输出整数,总之不能用科学计数法。
我采用的是stringstream流转换,因为想到这是一个流输出格式控制的问题,提问的时候便用更有代表性的iostream代替,可能造成各位在帮忙的时候走了些弯路,在此抱歉。
一楼的程序缺点是无法处理比较大的整数,且稍嫌麻烦,可能是我开始的问题没说清楚让你想多了(我还是想不到我的要求特别在哪里,呵呵),我原来想到的是二楼大神的方法,但希望有更简便的方式,因为我的程序可能会有上万个数据流过,希望这一步的处理越高效越好。我的C++水平不高,恳请各位指教。

//你的要求很特别,不管怎么说,这个基本达到你的要求了
#include <sstream>
#include <string>
#include <iomanip>
#include <iostream>
using namespace std;

void myPrint(double d){
std::stringstream ss1,ss2;
std::string text = "";

ss1<< d;
ss1 >> text;

if(text.find('e')!=string::npos){
string s1=text.substr(0,text.find('e'));
string s2=text.substr(text.find('e')+1);
ss2<<s2;
int bit;
ss2>>bit;
cout<<"0.";
for(int i=0;i<-bit-1;i++)
cout<<'0';
if(s1.find('.')!=string::npos)
cout<<s1.erase(s1.find('.'),s1.find('.'))<<"\n";
else
cout<<s1<<"\n";
}else
cout<<text<<"\n";
}
void main (void)
{
double dNum1=0.000003;
double dNum2=0.00006;

myPrint(dNum1);
myPrint(dNum2);

system("pause");
}
/*我勒个去,我觉得你特殊要求的地方就是那个6后面的0,为什么非要去掉?C和C++提供的对齐函数挺好的嘛,使你的数据显示的时候很整齐,要不然显的很杂乱。想要达到一定的目的,常常是要做出相应的代价的。另外,就是在数据位数很多的时候如,0.00000123456789,即使是科学计数法也会默认的取6位有效数字,要想显示全部位数,要么setprecision(n),这样有些数据后面有你不想要的0:(;要么采用二楼策略。*/追问

呵呵,因为用途不一样。我在做数据接口,要将double数据转成字符串型式存储而非输出,而转存的字符串长度是有限制的,所以我希望不必要的字符越少越好。
具体说来,我有一堆double数据(无法预知数值范围),需要分别将其转换为几组不同长度(已知)的字符串,将来其他程序要从这些字符串读出原有的double型数据以便进行计算,所以在第一步double到string时,精度损失越小越好。
请问你有什么比较好的思路吗?

追答

1、我明白了你目的,必须要做的是从double到string的转换,看来这是绕不过去了,所以我认为那个多余的0是不可避免的,setprecision这个函数是需要的,还得回到字符串删除0的问题上。我想这是最快的办法了。
2、“几组不同长度(已知)的字符串”是什么意思?

追问

“几组不同长度(已知)的字符串”意思就是对于同一个double数,如0.00003,有时需要转为“0.0000”(6位,算小数点,下同),有时转为“0.00003”(7位),有时是“0.000030(8位),视要求而定。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-13
因为浮点小数的小数位在定义或者输出的时候只能是固定的……直接输出恐怕不行。 添加个函数转化一下呗,把double转化成string类型,然后遍历string的字符(建议从后遍历),删除‘0’符号。然后直接输出string类型就行了,如果需要还可以再转化成double类型再输出。 string跟double的转化都有具体的函数…… 这个方法肯定可行。就是稍微麻烦点……
#include <sstream>
double a = 0.012500;
ostringstream os; //os可以是任何类型
os << a;
string str = os.str();
然后直接输出str就行了。没有后面的0了……

MessageBox(strAge.c_str(),NULL);追问

可能我问题没说清楚吧,我就是流转换时出现了问题,呵呵。

第2个回答  2011-10-13
那有上面几位那么复杂, 用setf 方法
cout.setf(ios_base::fixed,ios_base::floatfield);
它会覆盖cout 的默认设置, 响应随实现而异追问

不好意思,试验后感觉与 setiosflags(ios::fixed) 效果是一样的。

第3个回答  2011-10-14
看下IOS的设置位,可以设计为按照科学计数法输出,并且可以指定输出精度
第4个回答  2012-12-05
double要输出2进制一系列的数,那很容易,直接取出就好了,但是转化成10进制,会有些小量丢失,虽然比单精度要好点,但这个问题仍然会存在;
要较精准的输出一个10进制数,可以高精度运算,无论是你用bcd码,还是用字符串,或者在允许的范围内,自己用int,int64,一类的构造一套自己的规则 等等 都可以,或者直接用别人设计好的代码,反正 操作符是可以重载的,可以方便的和其他类型进行运算。
对于precision(n),需要知道n在固定小数格式的情况,具体是多少位和原来的情况是可能相等,用自欺欺人的办法,就是每次 对 double数去除整数部分(floor()似乎是,要注意正负情况的不同处理)然后对 此数 进行*10-整数部分,当最后这个东西& 一个全F的数,为0的情况下,结束;把反复次数取出来,就是n;这样也最多从外表上10进制运算。

本来想找找vc下cout在没格式下的自动变e表示的代码写在哪里,看到这里随便呓语几句,勿怪
相似回答