C++ 为什么double类型不能直接判断等于0
问题原因
精度丢失,
十进制小数部分在转换成2进制的时候经常会出现无限位的二进制小数,计算机存储小数有长度限制,所以会进行截取部分小数进行存储,计算机只能存储大概的值,而不是精确的值
。
例如:文章来源:https://www.toymoban.com/news/detail-524828.html
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 。文章来源地址https://www.toymoban.com/news/detail-524828.html
引申问题:两个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
}
到了这里,关于C++ 为什么double类型不能直接判断等于0 两个double类型怎么判断相等的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!