突っ走り書き

見せるほどのものでは..

NaNをフィルタするときに == と equals でハマった話

NaNの扱いがイマイチ分からんのです

scala> val l = List(1.0, 2.0, Double.NaN, 3.0)
l: List[Double] = List(1.0, 2.0, NaN, 3.0)

// == だとフィルタされない
scala> l.filterNot(_ == Double.NaN)
res0: List[Double] = List(1.0, 2.0, NaN, 3.0)

// equals だとフィルタされる
scala> l.filterNot(_.equals(Double.NaN))
res2: List[Double] = List(1.0, 2.0, 3.0)

// Double型だと == / equals で同じ動作
scala> l.filterNot(_ == 2.0)
res3: List[Double] = List(1.0, NaN, 3.0)

scala> l.filterNot(_.equals(2.0))
res4: List[Double] = List(1.0, NaN, 3.0)

原因が分かったけれども

理由が分からん!

コメントへの返信:xuweiさん

ご指摘ありがとうございます。
scalaの==/equalsメソッドの仕様かと疑っていたので、まさかJava絡みだったとは。
小さなJavaコードを作成して、動作を確かめてみました。


コメントへの返信:awekuitさん

コメントありがとうございます。
scalaでは isNaN メソッドがあるんですね。
可読性もあっていいと思うので、これからはこっちを使おうと思います。