簡單的說,比較兩個int型或long型的數(shù)據(jù)沒有什么問題,可以用==來判斷,但對浮點數(shù)(float與double)來說,需要對Float.NaN和0.0這個兩個特殊數(shù)字作額外的處理。
Float.NaN嚴格說來不是一個數(shù)字(它的字面意思也就是Not a Number),但是因為這個值可以被保存在一個float型的變量中(因為它常常是除0的結果),所以暫且當它是個數(shù)字吧。但它與一般的浮點數(shù)有些許不同,就是兩個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,就說明兩個數(shù)相等,返回-1,就說明第一個比第二個小,返回1則正好相反。
上面這兩行語句的返回結果都是0。
一般來說,基本類型的compare()方法與直接使用==的效果“應該”是一樣的,但在NaN這個問題上不一致,是利是弊,取決于使用的人作何期望。當程序的語義要求兩個NaN不應該被認為相等時(例如用NaN來代表兩個無窮大,學過高等數(shù)學的朋友們都記得,兩個無窮看上去符號是一樣,但不應該認為是相等的兩樣東西),就使用==判斷;如果NaN被看得無足輕重(畢竟,我只關心數(shù)字,兩個不是數(shù)字的東西就劃歸同一類好了嘛)就使用Float.compare()。
另一個在==和compare()方法上表現(xiàn)不一致的浮點數(shù)就是正0和負0(當然這也是計算機表示有符號數(shù)字的老大難問題),我們(萬能的)人類當然知道0.0f和-0.0f應該是相等的數(shù)字,但是試試下面的代碼:
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的比較來說,==是更好的選擇。