问题:浮点型数据存储方式会导致数据精度损失,增大计算误差。
float fval = 0.45; // 单步调试发现其真实值为:0.449999988
double dval = 0.45; // 单步调试发现其真实值为:0.45000000000000001
当很多个这样的单精度浮点型数据进行运算时,就会有累积误差,使得运算结果达不到理想的结果。尤其是对那种需要判断相等的情况(浮点型数据判断相等会有误差)。
因此我们可以通过把浮点型数据放大1e6倍,把它赋给一个整型变量,把得到的结果再除以1e6,就会使精度损失降到最低。
float a = 0.45; // 0.449999988double b = 0.45;int c = 1e6 *b; // 450000double d1 = 2 *a; // 0.89999997615814209int d = 2 *c; // 900000double d2 = d / 1e6; // 0.90000000000000002, 推荐方式
double d3 = 2 * 0.45; // 0.90000000000000002
下面是浮点型数据存储方式,转自:https://www.cnblogs.com/wuyuan2011woaini/p/4105765.html
C语言和 C#语言中,对于浮点型的数据采用单精度类型(float)和双精度类型(double)来存储:
float 数据占用 32bit;
double 数据占用 64bit;
我们在声明一个变量 float f = 2.25f 的时候,是如何分配内存的呢?