C++小数精度问题

在C++中使用float和double类型进行科学计算时,经常会遇到精度问题,需要注意识别和避免。

一、精度问题产生原因

float和double在计算机中的存储方式决定了它们表示小数的精度是有限的。

二、精度误差实例

float a = 1.2 - 1.0; // a != 0.2
double b = 1.2 - 1.0; // b != 0.2

三、精度误差积累

多次运算后精度误差会进一步积累:

float a = 1.2;
for(int i=0; i<100; i++)
  a -= 0.01;
// a != 1.0

四、对比效果

相同运算,float精度更低:

float a = 1.00000001; 
double b = 1.00000001;

a - 1 > 0; // false
b - 1 > 0; // true

五、解决方法

  • 尽量使用double代替float
  • 最后结果转为整数或固定精度小数
  • 使用更高精度的decimal类

六、注意避免

  • 不要直接比较两个小数的相等
  • 不要将计算结果直接转整形

需要注意浮点数精度问题,采取措施避免影响计算结果。