Così recentemente ho iniziato ad amare il linguaggio Kotlin. Oggi, confrontando i doppi, mi sono imbattuto nell'inevitabile NaN
.Confronto di 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
è un sottotipo diNumber
)
Esecuzione dei rendimenti di codice di cui sopra:
1: false
2: true
3: true
Capisco che comparing con NaN
in Java restituisce false
, quindi mi aspetterei false
per tutte le espressioni.
Come si spiega questo comportamento? Qual è la logica dietro di esso?
Credo che la vostra risposta sarebbe più completa se lei ha citato la seguente riga dal [documentazione] (https://docs.oracle.com/javase/7/docs/api/java/lang/ Double.html # doubleToLongBits (double)) di 'doubleToLongBits': ** tranne che tutti i valori NaN sono compressi in un singolo valore NaN" canonico "**. Altrimenti si potrebbe pensare che due diversi 'NaN's sarebbero paragonabili a quelli falsi con quella funzione. – nfs
@nrohwer, grazie per il tuo commento, ha aggiornato la risposta. – hotkey