如何比較整型的0和double型別的0 0

2021-10-04 10:27:50 字數 1033 閱讀 3831

寫在前面的話

1.由於計算機中採用的是有限位的二進位制編碼,所以浮點數在計算機中的儲存不總是精確的,通常會存在一些捨入誤差。

2.浮點數表示的資料型別往往具有不精確性,在進行精確度不高的運算時問題還不是很大,但是在進行關係運算時就會出現很大的問題。

3.判斷兩個浮點數是否相等這個操作本身就充滿了風險,並且不合理。

為什麼會出現這樣的不精確現象呢?

計算機在儲存資料型別時,是以二進位制的形式儲存的,對於double型別的資料也是一樣。對於乙個十進位制的小數轉化為二進位制時,採用的方法是乘二取整,正序排列。即:對被轉換的小數乘以2,取其整數部分(0或1)作為二進位制小數部分,取其小數部分,再乘以2,又取其整數部分作為二進位制小數部分,然後取小數部分,再乘以2,直到小數部分為0或者已經去到了足夠位數。

0.2 x 2 = 0.4 ............0

0.4 x 2 = 0.8 ............0

0.8 x 2 = 1.6 ............1

0.6 x 2 = 1.2 ............1

0.2 x 2 = 0.4 ............0

0.2乘以2,取整後小數部分再乘以2,運算4次後得到的整數部分依次為0、0、1、1,結果又變成了0.2,若果0.2再乘以2後會迴圈剛開始的4次運算,所以0.2轉換二進位制後將是001 1的迴圈,即: (0.2)10=(0.0011 0011 0011 …)2。由於任何資料型別都是有限制的,不能無限的使用計算機記憶體,這樣導致資料出現了捨入誤差。

浮點數0.0與整型0之間如何比較呢

如果乙個數 a 在 [b-eps, b+eps] 的區間中時,就應當判斷為 a==b 成立。經驗表明, eps 取 10-8是乙個合適的數字——對大多數的情況既不會漏判,也不會誤判。

int main (

void

)}

這樣就實現了整型的0和double型別的0.0的比較。

Junit中double型別的比較

在寫junit單元測試的時候發現直接用assertequals double,double 比較時會發生錯誤。報錯資訊 the method assertequals double,double from the type assert is deprecated junit中沒有assertequ...

無符號整型與有符號整型的比較

喵哥最近遇到乙個問題,比較兩個數的時候經常會出現很嚴重的bug,比如 unsigned int a 0 int b 2 if a b b 1 cout b endl 乍一看這段 輸出的應該是 2,0肯定不會小於 2嘛,但是事實上,b 1 這行 是會被執行的。如果大家對算術轉換比較熟悉的話,應該會想到...

整型包裝類值的比較

所有整型包裝類物件值的比較必須使用equals方法。先看下面這個例子 integer x 3 integer y 3 system.out.println x y true integer a new integer 3 integer b new integer 3 system.out.prin...