如题,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++水平不高,恳请各位指教。
C++ 中的数据怎样以浮点小数(而不是定点小数)输出,而不用科学计数法?
答案:5 悬赏:20 手机版
解决时间 2021-03-07 09:26
- 提问者网友:谁的错
- 2021-03-07 00:54
最佳答案
- 五星知识达人网友:老鼠爱大米
- 2021-03-07 01:28
//你的要求很特别,不管怎么说,这个基本达到你的要求了
#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");
}
#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");
}
全部回答
- 1楼网友:我住北渡口
- 2021-03-07 04:52
最简洁的:
a=1.23456;
b=(int)a*100;
a=(float)b/100;
现在a的值就成了1.23了
- 2楼网友:煞尾
- 2021-03-07 03:32
double要输出2进制一系列的数,那很容易,直接取出就好了,但是转化成10进制,会有些小量丢失,虽然比单精度要好点,但这个问题仍然会存在;
要较精准的输出一个10进制数,可以高精度运算,无论是你用bcd码,还是用字符串,或者在允许的范围内,自己用int,int64,一类的构造一套自己的规则 等等 都可以,或者直接用别人设计好的代码,反正 操作符是可以重载的,可以方便的和其他类型进行运算。
对于precision(n),需要知道n在固定小数格式的情况,具体是多少位和原来的情况是可能相等,用自欺欺人的办法,就是每次 对 double数去除整数部分(floor()似乎是,要注意正负情况的不同处理)然后对 此数 进行*10-整数部分,当最后这个东西& 一个全F的数,为0的情况下,结束;把反复次数取出来,就是n;这样也最多从外表上10进制运算。
本来想找找vc下cout在没格式下的自动变e表示的代码写在哪里,看到这里随便呓语几句,勿怪
- 3楼网友:詩光轨車
- 2021-03-07 03:17
那有上面几位那么复杂, 用setf 方法
cout.setf(ios_base::fixed,ios_base::floatfield);
它会覆盖cout 的默认设置, 响应随实现而异
- 4楼网友:酒安江南
- 2021-03-07 01:48
因为浮点小数的小数位在定义或者输出的时候只能是固定的……直接输出恐怕不行。 添加个函数转化一下呗,把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);
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯