C++ 為什么double類型不能直接判斷等于0
問題原因
精度丟失,
十進制小數(shù)部分在轉換成2進制的時候經(jīng)常會出現(xiàn)無限位的二進制小數(shù),計算機存儲小數(shù)有長度限制,所以會進行截取部分小數(shù)進行存儲,計算機只能存儲大概的值,而不是精確的值
。
例如:文章來源:http://www.zghlxwxcb.cn/news/detail-524828.html
2.1 分成兩部分
// 整數(shù)部分
2 / 2 = 1 .... 0
1 / 2 = 0 .... 1
// 小數(shù)部分
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
............ 無限循環(huán)了
實際使用時判斷方法
判斷一個單精度浮點數(shù):則是
if( abs(f) <= 1e-6);
要判斷一個雙精度浮點數(shù):則是if( abs(f) <= 1e-15 );
若小于,為0;若大于,不為0 。文章來源地址http://www.zghlxwxcb.cn/news/detail-524828.html
引申問題:兩個double類型怎么判斷相等?
方法一: 使用epsilon
// EPSILON指的是浮點數(shù)可表示的最小值
static inline bool DoubleEqual(double a, double b)
{
return fabs(a - b) < std::numeric_limits<double>::epsilon();
}
方法二: 根據(jù)精度
static inline bool DoubleEqual(double a, double b)
{
return fabs(a - b) < 0.000001
}
到了這里,關于C++ 為什么double類型不能直接判斷等于0 兩個double類型怎么判斷相等的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!