Chinaunix首页 | 论坛 | 博客
  • 博客访问: 724030
  • 博文数量: 251
  • 博客积分: 10367
  • 博客等级: 上将
  • 技术积分: 2750
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-10 14:43
文章分类

全部博文(251)

文章存档

2009年(2)

2008年(86)

2007年(163)

分类: C/C++

2007-11-03 23:30:03

你打印浮点数可能会遇到下列情况:(当然如果用cout就不会了 :) )
像3.2 * 3 输出9.6000001 , 5 + 0.1 输出5.0999999
 
cout 处理的原则是:
有些十进制小数无法精确用二进制小数表示,如:0.1,因此计算机中存储的是它们的近似值。cout输出的是从二进制近似值转换成十进制数的结果,cout根据设置的有效数字进行舍入处理。就是cout默认为6位,那0.09999999999999999999就变成0.099999,然后舍入为0.1。

写了下面的程序:
 
#include
#include
 
void Printf(double result)
{
    int i;
    long int c;
    c = (long )(result * pow(10,6)); // change
    if(result * pow(10,6) - c >= 0.5)
          c += 1;
/*    printf("%ld\n",c);*/
    for(i = 0;i < 6; i++)
    {
        if( c%10 != 0)
            break;
        c = c / 10;   
    }   
    printf("%.*f\n",6-i,result);
}
int main()
{
    double a = 0.0000000000001,b = 0.099999999999,c = 0.0999984;
    printf("%f\n",3.2*3);
    Printf(3.2*3);
    Printf(b);
    Printf(c);
   
    getchar();
    return 0;
}
 
 
注:后来发现其实printf已经提供这样的参数了,  printf("%g",f);
阅读(1176) | 评论(0) | 转发(0) |
0

上一篇:c语言词法分析器

下一篇:算法方面的好书

给主人留下些什么吧!~~