首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-06-05 
求问VC中关于double精度不准确的问题,C/C++ code#includestdio.hint main(){longi[40],d[40]//结果数组

求问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

热点排行