So begann ich vor kurzem die Sprache Kotlin zu lieben. Heute, während ich Doubles vergleiche, bin ich auf das unvermeidliche NaN
gestoßen.Vergleichen NaN in 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))
}
NB: (Double
ist ein Subtyp vonNumber
)
die oben genannten Code Ausbeuten Lauf:
1: false
2: true
3: true
Ich verstehe, dass comparing mit NaN
in Java gibt false
, also würde icherwartenfür alle Ausdrücke.
Wie kann dieses Verhalten erklärt werden? Was ist der Grund dafür?
Ich denke, die Antwort wäre vollständig, wenn Sie die folgende Zeile aus der [Dokumentation] erwähnt (https://docs.oracle.com/javase/7/docs/api/java/lang/ Double.html # doubleToLongBits (double)) von 'doubleToLongBits': ** Ausnahme: alle NaN-Werte werden auf einen einzelnen" kanonischen "NaN-Wert reduziert **. Sonst könnte man meinen, dass zwei verschiedene NaN mit dieser Funktion mit false verglichen würden. – nfs
@nrohwer, danke für deine Bemerkung, habe die Antwort aktualisiert. – hotkey