Java中NaN和 0 0f的比較問題

2021-09-06 14:53:48 字數 1481 閱讀 6381

簡單的說,比較兩個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...