C++ 为什么double类型不能直接判断等于0
问题原因
精度丢失,
十进制小数部分在转换成2进制的时候经常会出现无限位的二进制小数,计算机存储小数有长度限制,所以会进行截取部分小数进行存储,计算机只能存储大概的值,而不是精确的值
。
例如:
2.1 分成两部分
// 整数部分
2 / 2 = 1 .... 0
1 / 2 = 0 .... 1
// 小数部分
0.1 * 2 = 0.2 .... 0
0.2 * 2 = 0.4 .... 0
0.4 * 2 = 0.8 .... 0
0.8 * 2 = 1.6 .... 1
0.6 * 2 = 1.2 .... 1
0.2 * 2 = 0.4 .... 0
0.4 * 2 = 0.8 .... 0
0.8 * 2 = 1.6 .... 1
0.6 * 2 = 1.2 .... 1
0.2 * 2 = 0.4 .... 0
0.4 * 2 = 0.8 .... 0
0.8 * 2 = 1.6 .... 1
0.6 * 2 = 1.2 .... 1
............ 无限循环了
实际使用时判断方法
判断一个单精度浮点数:则是
if( abs(f) <= 1e-6);
要判断一个双精度浮点数:则是if( abs(f) <= 1e-15 );
若小于,为0;若大于,不为0 。
引申问题:两个double类型怎么判断相等?
方法一: 使用epsilon
// EPSILON指的是浮点数可表示的最小值
static inline bool DoubleEqual(double a, double b)
{
return fabs(a - b) < std::numeric_limits<double>::epsilon();
}
方法二: 根据精度
static inline bool DoubleEqual(double a, double b)
{
return fabs(a - b) < 0.000001
}