永发信息网

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

答案:5  悬赏:20  手机版
解决时间 2021-03-07 09:26
如题,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");
}
全部回答
最简洁的: a=1.23456; b=(int)a*100; a=(float)b/100; 现在a的值就成了1.23了
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 的默认设置, 响应随实现而异
因为浮点小数的小数位在定义或者输出的时候只能是固定的……直接输出恐怕不行。 添加个函数转化一下呗,把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);
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
阴阳师姑获鸟妖刀姬茨木哪个先六星好
姓氏‘敬’用普通话怎么读?
从南京坐车到郑州需要多长时间?
小苹果论坛谁有教我一下
五岁孩子眼睛视力正常应该多少度
小的时候被铅笔戳到,后来就留下来一个痣,怎么
电瓶大世界在哪里啊,我有事要去这个地方
透明质酸原液是什么
(10分)右图是某高等动物的染色体组成示意图,
cuou手表是什么牌子
WISP模式是不是万能中继模式
锤子白色32g不小心摔了,现在摄像头不能用了
雅香阁怎么去啊,有知道地址的么
初中生戴美度贝伦赛丽会不会太招摇?
做产品责任险,哪家保险公司最好
推荐资讯
农业银行贷款是不是自己的卡上还要有钱
宝鸡市到青岛怎么开车走
黑豹1036上什么牌照C3驾驶证可以开啊?什么颜
轻歌剧的各国轻歌剧
75吨流化床锅炉点火多长时间为最好
瓷砖上可不可以粘贴石膏板或者三合板
与世长辞的辞是什么意思?
一个克一个寸念什么
社保只显示个人所交金额,公司所交为0,是公
每米宽铰接悬臂板的根部由车辆荷载产生的弯矩
应聘操盘手问题
魔域灵魂晶石怎么获得
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?