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表示的代码写在哪里,看到这里随便呓语几句,勿怪

...中的数据怎样以浮点小数(而不是定点小数)输出,而不用科学计数法?
用setf 方法 cout.setf(ios_base::fixed,ios_base::floatfield);它会覆盖cout 的默认设置,响应随实现而异

...中的数据怎样以浮点小数(而不是定点小数)输出,而不用科学计数法?
C和C++提供的对齐函数挺好的嘛,使你的数据显示的时候很整齐,要不然显的很杂乱。想要达到一定的目的,常常是要做出相应的代价的。另外,就是在数据位数很多的时候如,0.00000123456789,即使是科学计数法也会默认的取6位有效数字,要想显示全部位数,要么setprecision(n),这样有些数据后面有你不想要的0:...

c++浮点数存储方式
在处理这种不带小数的浮点数时,直接将整数部转化为二进制表示:1 11100010 01000000也可以这样表示:11110001001000000.0然后将小数点向左移,一直移到离最高位只有1位,就是最高位的1:1.11100010010000000一共移动了16位,在布耳运算中小数点每向左移一位就等于在以2为底的科学计算法表示中指数+1,所以原数就等于这样...

浮点数在计算机中是如何表示的?
下面我仅以float(带符号,单精度,32位)类型的浮点数说明C++中的浮点数是如何在内存中表示的。先讲一下基础知识,纯小数的二进制表示。(纯小数就是没有整数部分的小数,讲给小学没好好学的人)纯小数要想用二进制表示,必须先进行规格化,即化为 1.xxxxx * ( 2 ^ n ) 的形式(“^”代表乘...

c++中如何精确输出的位数?
\/\/fixed:表示普通方式输出,不采用科学计数法。fixed也可以放在setprecision(n)后面 cout<<" 12345.0保留8位有效数字输出为:"<<12345.0<<endl;cout<<fixed<<setprecision(2)<<" -123.456保留2位有效数字输出为:"<<-123.456<<endl;cout << setprecision (4); \/\/ 精度 cout.setf(ios...

C++中double型数值两种输出格式中,何时用指数形式,何时用小数点形式...
ios::showpoint 指定浮点数输出时应带小数点。这通常和ios::fixed一起使用保证小数点后面有一定位数 ios::uppercase 指定表示十六进制Rx应为大写,表示浮点科学计数法的e应为大写 ios::showpos 指定正数和负数前面分别加上正号或-号 ios::scientific 指事实上浮点数输出采用科学计数法 ios::fixed 指...

c++中如何输出一个八位小数
fixed:表示普通方式输出,不采用科学计数法。setprecision:控制输出流显示浮点数的数字个数,如果和fixed合用的话,可以控制小数点右面的位数。include<iostream>#include<iomanip>using namespace std;int main(){cout<<12345.0<<endl;\/\/输出12345\/\/cout<<fixed<<setprecision(2)<<123.456<<endl;\/*...

C++编程中setprecision(0)什么意思?
在C++编程中,`setprecision(n)`是一个强大的工具,它用于控制浮点数在输出流中的精确度。默认情况下,C++的输出流会显示6位有效数字。当你将`setprecision(n)`与`setiosflags(ios::fixed)`一起使用时,它会限制小数点右边的数字个数,将数值以定点方式表示。如果与`setiosflags(ios::scientific)`配合...

c++输出中怎么控制小数点后面的位数?
1、首先,定义三个实数型变量,保存计算的数值。2、接着,给x和y赋值。3、对x和y进行除法运算,保存在变量z中。4、最后,输出变量z的值。5、运行程序,可以看到计算得到的数值,小数点后位数是默认的。6、可以在%之后,添加数值的小数点后位数。7、运行程序,输出实数的小数点后位数,按照设定的值...

请教一个C++中的问题,setiosflags(ios::fixed)与fixed
设置浮点数以固定的小数位数显示

相似回答