Więc niedawno zacząłem kochać język kotlin. Dzisiaj, porównując duble, natknąłem się na nieuniknione NaN
.Porównanie NaN w Kotlin
fun main(args: Array<String>) {
val nan = Double.NaN
println("1: " + (nan == nan))
println("2: " + (nan == (nan as Number)))
println("3: " + ((nan as Number) == nan))
}
Uwaga: (Double
jest podtypemNumber
)
Przeprowadzenie powyższych wydajności kod:
1: false
2: true
3: true
I zrozumieć, że comparing z NaN
Java powraca false
, więc oczekiwałbym false
dla wszystkich wyrażeń.
Jak to zachowanie można wyjaśnić? Jakie są przesłanki tego działania?
myślę, że odpowiedź byłaby pełniejsza, jeśli wymienić następujące linię z [dokumentacja] (https://docs.oracle.com/javase/7/docs/api/java/lang/ Double.html # doubleToLongBits (double)) z 'doubleToLongBits': ** oprócz wszystkich wartości NaN są zwinięte do pojedynczej" kanonicznej "wartości NaN **. W przeciwnym razie można by pomyśleć, że dwa różne 'NaN 'będą porównywać do false z tą funkcją. – nfs
@nrohwer, dzięki za uwagę, zaktualizowałeś odpowiedź. – hotkey