点点滴滴”

导航

double float的精度问题

三部曲

1:

 #include <iostream>
 #include <stdio.h>
 #include <string.h>

 using namespace std;

 int main()
 {
     double a=0.0001;
     float b=0.1;
     int c=(int)(a*1000)/b;
     cout<<c<<endl;
 }     ///期望c==1   结果c却==0

 2:

 #include <iostream>
 #include <stdio.h>
 #include <string.h>

 using namespace std;

 int main()
 {
     double a=0.0001;
     float b=0.1;
     int c=(int)(a*1000)/b;
      printf("%.15lf\n",b);///实验结果证明  float转成double时出现了精度问题
     cout<<a<<endl;
     cout<<c<<endl;    ///int向上取整  所以==0了
 }

3:

 

#include <iostream>
 #include <stdio.h>
 #include <string.h>

 using namespace std;

 int main()
 {
     double a=0.0001;
     double b=0.1;      ///我将float变成double  就OK了
     int c=(int)(a*1000)/b;
      printf("%.15lf\n",b);
     cout<<a<<endl;
     cout<<c<<endl;
 }

4::::

double f;

int num =(int) f*100;

结果是:输入f = 1.23,  输出 num = 122.

  输入f = 1.25  输出 num =125

这就是著名的double精度损失问题。

 

因为1.23在计算机里面只能表示为近似值:1.2299999999.........

而1.25却能被精确的表示:

 

解决的办法是:

int num = (int)(f*100+0.0001),这个0.0001根据你需要的精度来设置,是可以改变的

这时候,不管f=1.23还是f=1.25,结果都是我们想要的123和125.

关键是要理解:  10110101 只是近似等于 1.0110101 * 2^7.



 

 int float double 之间的关系是 int可以隐式转换成double 和float;
                                         float只能强制转换成int  但是可以隐式转换成double;
                                         double只能强制转换成int和float
 int与float之间的转换精度会缺失 当int——>float——>int时   两个int已经不相等了
 double与float之间的转换精度也会缺失 当double——>float——>double时  两个double不相等了
::::计算机以二进制存储数据  小数的二进制有可能会丢失数据 所以会存在误差   而int型二进制会除尽  不存在误差

posted on 2014-07-27 09:01  点点滴滴”  阅读(1338)  评论(0编辑  收藏  举报