在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类
六、注意避免
- 不要直接比较两个小数的相等
- 不要将计算结果直接转整形
需要注意浮点数精度问题,采取措施避免影响计算结果。