读书人

求问VC中关于double精度不准确的有关问

发布时间: 2012-06-05 13:54:06 作者: rapoo

求问VC中关于double精度不准确的问题,

C/C++ code
#include<stdio.h>int main()  {    long    i[40],d[40];                //结果数组,i数组是整数部分,d数组是小数部分    double    m[5];                        //m数组是求次幂的底数    int        n[5];                        //n数组是求次幂的指数    int        k=0;                            //k是输入了多少组    for(k=0; k<6; k++)    {        scanf("%lf%d",&m[k],&n[k]);    }    for(k=0; k<6; k++)    {        printf("%lf %d\n",m[k],n[k]);    }    return 0; } 

这是一个程序的一小部分,虽然定义了几个数组没用,但应该不妨碍,
下面是输入,
99.9 25
99.9 25
99.9 25
99.9 25
99.9 25
99.9 25
然后下面是输出
99.899963 25
99.900000 25
99.900000 25
99.900000 25
99.900000 25
99.900000 25
Press any key to continue
我不明白为什么会最上面的99.9会变成这样,
我单步调试了下,
每次,输入,99.9 实际的值都是,99.900000000000006
然后当我输完最后一个后,也就循环到最后一次时,我输入99.9 m[0]里面的值会变成
99.899963378906605
我就是想问下,这到底是什么原因导致的输入数不精确,,
求大神帮忙

[解决办法]
是应为浮点型的特殊存储的问题,1在内存中不是1,可能是0.99999999,可能是1.00000000000000001
[解决办法]
浮点数的存储、运算都会引入误差,只要用它,这是免不了的
如果一定要精确,干脆使用定点表示得了:用整数,实在不够用数组,再加上指明小数位数的一个整数
[解决办法]
前面的几楼都说了,你如果这样

for(k=0; k<6; k++)
{
printf("%lf %d\n",m[k],n[k]);//改为printf("%.1f %d\n",m[k],n[k]);
}

那么输出的都是99.9

读书人网 >C语言

热点推荐