C++中,如何保留指定的小数位,不是COUT输出~
实际情况是,碰到一个数值比如a=0.995,b=1/a=1.00502512568****,大约三十位吧。可是实际只保留小数点后面5位。float和double我都试验了...
实际情况是,碰到一个数值比如a=0.995,b=1/a=1.00502512568****,大约三十位吧。可是实际只保留小数点后面5位。float和double我都试验了,可是都自动舍去。
是用积分法求pi的程序,pi的精度要求很高。可是结果却保留了5位,然后挨个数据输出测试,应该在c那里。b的时候还保留很多位,一旦1/b之后,只保留5位小数了
double pi=0.0,a,b,c;
int N=100000,i;
for(i=0;i<N;i++)
{
a=(i+0.5)/N,2;
float(d)=1/a;
b=pow(a,2);
float(c)=1/b;
pi=pi+1/(1+pow(a,2))*4/N;
}
a=(i+0.5)/N,2;后面那个2是没有的。弄错了 展开
是用积分法求pi的程序,pi的精度要求很高。可是结果却保留了5位,然后挨个数据输出测试,应该在c那里。b的时候还保留很多位,一旦1/b之后,只保留5位小数了
double pi=0.0,a,b,c;
int N=100000,i;
for(i=0;i<N;i++)
{
a=(i+0.5)/N,2;
float(d)=1/a;
b=pow(a,2);
float(c)=1/b;
pi=pi+1/(1+pow(a,2))*4/N;
}
a=(i+0.5)/N,2;后面那个2是没有的。弄错了 展开
5个回答
展开全部
要在计算过程中保留若干小数位,可以使用以下思路:
1 要将实数f保留n为小数位,先f*10^n,相当于小数点右移n位;
2 将变量取整,舍去多余的小数位;
3 结果除以10^n,等同于小数点左移n位,实现目的。
其中1 2之间,如果有舍入需求,可以先做舍入,再取整。
考虑到移动小数点时可能溢出导致结果不精确,可以保持原数不动,只取小数部分做操作,结果再加上原数的整数部分即可。
参考代码如下:
double f = 1.12345678;
double t1;
int n;
cin >> n;//保留n位有效数字。
t1 = f - (int)f;//取小数部分。
t1*=pow(10, n);//小数点左移。
if(t1-(int)t1 >= 0.5) t1+=1; //四舍五入
t1 = (int)t1; //取整数部分。
t1/=pow(10, n);//小数点右移。
t1+=(int)f;//加上原本的整数部分。
cout <<"the result is " << t1 << endl;//输出结果。
展开全部
没有去调查是否有直接函数或者格式显示三十多位,不过我提供个思路,比如a=0.995,b=1/a=1.00502512568****, 保留三十位的话,你可以先扩大二十多位,
比如b=10000000000000000000000000000/1.0050025.。。。。。
这样子求出来(具体几位可以尝试),然后 转换为字符型,用字符格式控制输出
比如b=10000000000000000000000000000/1.0050025.。。。。。
这样子求出来(具体几位可以尝试),然后 转换为字符型,用字符格式控制输出
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实数据是比较精确的,只不过cout的时候默认给你四舍五入了。
你可以通过setprecision(x)来控制输出精度
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
double pi=0.0,a,b,c;
int N=1000000,i;
for(i=0;i<N;i++)
{
a=(i+0.5)/N;
pi=pi+1/(1+pow(a,2))*4/N;
}
cout << setprecision(20) << pi << endl;
}
你可以通过setprecision(x)来控制输出精度
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
double pi=0.0,a,b,c;
int N=1000000,i;
for(i=0;i<N;i++)
{
a=(i+0.5)/N;
pi=pi+1/(1+pow(a,2))*4/N;
}
cout << setprecision(20) << pi << endl;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上的答案也是有位数限制的,一般大于20就不行了。
用一个你想要的位数n,创建一个数组,比如n=1000,s[1000],每次精确一次,就把尾数存入数组s,最后循环输出就可以了。
用一个你想要的位数n,创建一个数组,比如n=1000,s[1000],每次精确一次,就把尾数存入数组s,最后循环输出就可以了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个浮点数是不精确的,不可能做那样的处理。你可以自己写一个精度小数类来处理,不过应该有些难度,不过你可以参考其它语言的实现,如java的BigDecimal、Python的decimal.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询