簡單的說,比較兩個int型或long型的資料沒有什麼問題,可以用==來判斷,但對浮點數(float與double)來說,需要對float.nan和0.0這個兩個特殊數字作額外的處理。
float.nan嚴格說來不是乙個數字(它的字面意思也就是not a number),但是因為這個值可以被儲存在乙個float型的變數中(因為它常常是除0的結果),所以暫且當它是個數字吧。但它與一般的浮點數有些許不同,就是兩個nan用==比較的結果會得到false。
可以用下面的**驗證:
float
nan=
float.nan;
float
anothernan
=float.nan;
system.out.println(nan
==anothernan);
輸出結果為false
我用另一種除0的方法得到nan,可以看到使用==判斷仍然得到false。**如下:
float
overflow
=0.0f
/0.0f
;system.out.println(overflow);
system.out.println(nan
==overflow);
而當我們使用float.compare()這個方法來比較兩個nan時,卻會得到相等的結果。可以用下面的**驗證:
system.out.println(float.compare(nan,anothernan));
system.out.println(float.compare(nan,overflow));
compare()方法如果返回0,就說明兩個數相等,返回-1,就說明第乙個比第二個小,返回1則正好相反。
上面這兩行語句的返回結果都是0。
一般來說,基本型別的compare()方法與直接使用==的效果「應該」是一樣的,但在nan這個問題上不一致,是利是弊,取決於使用的人作何期望。當程式的語義要求兩個nan不應該被認為相等時(例如用nan來代表兩個無窮大,學過高等數學的朋友們都記得,兩個無窮看上去符號是一樣,但不應該認為是相等的兩樣東西),就使用==判斷;如果nan被看得無足輕重(畢竟,我只關心數字,兩個不是數字的東西就劃歸同一類好了嘛)就使用float.compare()。
另乙個在==和compare()方法上表現不一致的浮點數就是正0和負0(當然這也是計算機表示有符號數字的老大難問題),我們(萬能的)人類當然知道0.0f和-0.0f應該是相等的數字,但是試試下面的**:
float
negzero
=-0.0f
;float
zero
=0.0f
;system.out.println(zero
==negzero);
system.out.println(float.compare(zero,negzero));
返回的結果是true和-1。看到了麼,==認為正0和負0相等,而compare()方法認為正0比負0要大。所以對0的比較來說,==是更好的選擇。
python中nan的比較
在用numpy.sum等方法計算列表時,當列表中無目標元素,得到的為空值nan。然而不同於none,它無法用 進行判斷。nan not a number 在數學表示上表示乙個無法表示的數,這裡一般還會有另乙個表述inf,inf和nan的不同在於,inf是乙個超過浮點表示範圍的浮點數 其本質仍然是乙個...
java中equals方法和「 」的比較
有兩種用法說明 1 對於字串變數來說,使用 和 equals 方法比較字串時,其比較方法不同。比較兩個變數本身的值,即兩個物件在記憶體中的首位址。equals 比較字串中所包含的內容是否相同。比如 string s1,s2,s3 abc s4 abc s1 new string abc s2 new...
java中equals方法和「 」的比較
關於equals與 的區別從以下幾個方面來說 1 如果是基本型別比較,那麼只能用 來比較,不能用equals 比如 public class testequals 2 對於基本型別的包裝型別,比如boolean character byte shot integer long float doubl...