你打印浮点数可能会遇到下列情况:(当然如果用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);
阅读(1206) | 评论(0) | 转发(0) |