注册 登录
编程论坛 C++教室

关于double型小数点位数的问题

linan03 发布于 2012-11-21 00:21, 8433 次点击
我用的是VC2010
简单的函数,求x的n次方。
#include<iostream>
using namespace std;
double power(double x,int n)
{
    int i;
    double h;
    h=x;
    for(i=2;i<=n;i++)
    {
        x*=h;
    }
    if(n==0)
        x=1;
    return x;
}

void main()
{
    int n;
    double x,length;
    cout<<"请输入x:";
    cin>>x;
    cout<<"请输入n:";
    cin>>n;

    length=power(x,n);
    cout<<length<<endl;
}

运行时
x=3.1415926
n=2
得出的结果是9.8696

都是double型的,为什么相乘后小数点后位数反而少了?
求解释
6 回复
#2
rjsp2012-11-21 09:24
1。计算机用的是浮点数,不是定点数
2。显示多少位由setprecision设置
#3
mmmmmmmmmmmm2012-11-21 09:34
楼主可以通过setprecision(n)来指定小数的显示位数,需要#include <iomanip>

    cout<<setprecision(8)<<length<<endl;
#4
linan032012-11-24 03:11
回复 2楼 rjsp
额,在我的认知中double型的是可以保存小数点后至少7位的吧,我相乘的两个数都是double型肯定保证这两个数小数点后7位都有保存在内存中吧,得出的结果也是存放在double型里,可是得出的结果小数点后的位数反而变少了。
这和你说的计算机使用的是浮点数不是定点数有什么关系? 能不能具体解释一下。
#5
wp2319572012-11-24 08:03
格式化输出
例如:
printf("%.10lf",浮点数);
这是c代码  c++中肯定也有类似的代码
#6
rjsp2012-11-24 08:31
以下是引用linan03在2012-11-24 03:11:48的发言:

额,在我的认知中double型的是可以保存小数点后至少7位的吧,我相乘的两个数都是double型肯定保证这两个数小数点后7位都有保存在内存中吧,得出的结果也是存放在double型里,可是得出的结果小数点后的位数反而变少了。
这和你说的计算机使用的是浮点数不是定点数有什么关系? 能不能具体解释一下。
在我的认知中double型的是可以保存小数点后至少7位的吧
------ 错,double的有效位有53bits,即十进制的15到16位有效数字。和小数点后几位毫无一丝关系,你知道科学计数法吗,有点类似。
如果你一定要刨根问底,当你输入3.1415926后,x的值为 3.14159260000000006840537025709636509418487548828125
length=x*x 的值为 9.8696040643747604548252638778649270534515380859375
当用cout输出这个9.8696040643747604548252638778649270534515380859375时,截取前6位有效数字而显示9.8696,相当于C中的printf( "%6g", length )。这是默认设置,你可以用setprecision设置输出任意长度。

可是得出的结果小数点后的位数反而变少了。
------ 如果你问别人pi等于多少,有的人说3.14,有的人说3.14159265,虽然值不一样,但说的都是同一个确定的pi

#7
linan032012-11-24 19:22
回复 6楼 rjsp
哇  版主牛逼... 俺明白了..  非常感谢!!   
1